From 68ffa9822b56475157cb23706d0f9709d494ef57 Mon Sep 17 00:00:00 2001 From: Adphi Date: Mon, 14 Apr 2025 08:56:55 +0200 Subject: [PATCH] proxy: use grpc interfaces instead of *grpc.Server and *grpc.ClientConn, use Service and service Options Signed-off-by: Adphi --- proxy/examples_test.go | 11 +- proxy/handler.go | 2 +- proxy/proxy.go | 22 ++-- proxy/proxy_test.go | 26 ++-- proxy/testservice/test.pb.go | 188 ++++++++++++--------------- proxy/testservice/test_grpc.pb.go | 160 +++++++++-------------- proxy/testservice/test_vtproto.pb.go | 3 +- 7 files changed, 182 insertions(+), 230 deletions(-) diff --git a/proxy/examples_test.go b/proxy/examples_test.go index 358af7b..b822b5a 100644 --- a/proxy/examples_test.go +++ b/proxy/examples_test.go @@ -14,26 +14,27 @@ import ( "google.golang.org/grpc/status" "go.linka.cloud/grpc-toolkit/proxy" + "go.linka.cloud/grpc-toolkit/service" ) var ( director proxy.StreamDirector ) -func ExampleNewProxy() { +func ExampleNew() { dst, err := grpc.Dial("example.com") if err != nil { log.Fatalf("dialing example.org: %v", err) } - proxy := proxy.NewProxy(dst) + proxy, _ := proxy.New(dst) _ = proxy } func ExampleRegisterService() { - // A gRPC server with the proxying codec enabled. - server := grpc.NewServer() + // A gRPC service with the proxying codec enabled. + svc, _ := service.New() // Register a TestService with 4 of its methods explicitly. - proxy.RegisterService(server, director, + proxy.RegisterService(svc, director, "mwitkow.testproto.TestService", "PingEmpty", "Ping", "PingError", "PingList") } diff --git a/proxy/handler.go b/proxy/handler.go index e4edbb9..fddc2b8 100644 --- a/proxy/handler.go +++ b/proxy/handler.go @@ -22,7 +22,7 @@ var ( // RegisterService sets up a proxy handler for a particular gRPC service and method. // The behaviour is the same as if you were registering a handler method, e.g. from a generated pb.go file. -func RegisterService(server *grpc.Server, director StreamDirector, serviceName string, methodNames ...string) { +func RegisterService(server grpc.ServiceRegistrar, director StreamDirector, serviceName string, methodNames ...string) { streamer := &handler{director} fakeDesc := &grpc.ServiceDesc{ ServiceName: serviceName, diff --git a/proxy/proxy.go b/proxy/proxy.go index 02e6076..68a73f5 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -8,26 +8,32 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/metadata" + + "go.linka.cloud/grpc-toolkit/service" ) -// NewProxy sets up a simple proxy that forwards all requests to dst. -func NewProxy(dst *grpc.ClientConn, opts ...grpc.ServerOption) *grpc.Server { - opts = append(opts, DefaultProxyOpt(dst)) +// New sets up a simple proxy that forwards all requests to dst. +func New(dst grpc.ClientConnInterface, opts ...service.Option) (service.Service, error) { + opts = append(opts, WithDefault(dst)) // Set up the proxy server and then serve from it like in step one. - return grpc.NewServer(opts...) + return service.New(opts...) } -// DefaultProxyOpt returns an grpc.UnknownServiceHandler with a DefaultDirector. -func DefaultProxyOpt(cc *grpc.ClientConn) grpc.ServerOption { - return grpc.UnknownServiceHandler(TransparentHandler(DefaultDirector(cc))) +// WithDefault returns a grpc.UnknownServiceHandler with a DefaultDirector. +func WithDefault(cc grpc.ClientConnInterface) service.Option { + return service.WithGRPCServerOpts(grpc.UnknownServiceHandler(TransparentHandler(DefaultDirector(cc)))) } // DefaultDirector returns a very simple forwarding StreamDirector that forwards all // calls. -func DefaultDirector(cc *grpc.ClientConn) StreamDirector { +func DefaultDirector(cc grpc.ClientConnInterface) StreamDirector { return func(ctx context.Context, fullMethodName string) (context.Context, grpc.ClientConnInterface, error) { md, _ := metadata.FromIncomingContext(ctx) ctx = metadata.NewOutgoingContext(ctx, md.Copy()) return ctx, cc, nil } } + +func With(director StreamDirector) service.Option { + return service.WithGRPCServerOpts(grpc.UnknownServiceHandler(TransparentHandler(director))) +} diff --git a/proxy/proxy_test.go b/proxy/proxy_test.go index d2ce740..65fe805 100644 --- a/proxy/proxy_test.go +++ b/proxy/proxy_test.go @@ -13,6 +13,7 @@ import ( "go.linka.cloud/grpc-toolkit/proxy" "go.linka.cloud/grpc-toolkit/proxy/testservice" + "go.linka.cloud/grpc-toolkit/service" ) var testBackend = flag.String("test-backend", "", "Service providing TestServiceServer") @@ -45,11 +46,10 @@ func TestLegacyBehaviour(t *testing.T) { } // Set up the proxy server and then serve from it like in step one. - proxySrv := grpc.NewServer( - //lint:ignore SA1019 regression test - grpc.CustomCodec(proxy.Codec()), // was previously needed for proxy to function. - grpc.UnknownServiceHandler(proxy.TransparentHandler(directorFn)), - ) + proxySrv, err := service.New(proxy.With(directorFn)) + if err != nil { + panic(err) + } // run the proxy backend go func() { t.Log("Running proxySrv") @@ -62,7 +62,7 @@ func TestLegacyBehaviour(t *testing.T) { }() t.Cleanup(func() { t.Log("Gracefully stopping proxySrv") - proxySrv.GracefulStop() + proxySrv.Stop() }) }() @@ -106,7 +106,10 @@ func TestNewProxy(t *testing.T) { t.Helper() // First, we need to create a client connection to this backend. - proxySrv := proxy.NewProxy(testCC) + proxySrv, err := proxy.New(testCC) + if err != nil { + panic(err) + } // run the proxy backend go func() { @@ -120,7 +123,7 @@ func TestNewProxy(t *testing.T) { }() t.Cleanup(func() { t.Log("Gracefully stopping proxySrv") - proxySrv.GracefulStop() + proxySrv.Stop() }) }() @@ -156,7 +159,10 @@ func backendDialer(t *testing.T, opts ...grpc.DialOption) (*grpc.ClientConn, err backendBc := bufconn.Listen(10) // set up the backend using a "real" server over a bufconn - testSrv := grpc.NewServer() + testSrv, err := service.New() + if err != nil { + t.Fatal(err) + } testservice.RegisterTestServiceServer(testSrv, testservice.DefaultTestServiceServer) // run the test backend @@ -171,7 +177,7 @@ func backendDialer(t *testing.T, opts ...grpc.DialOption) (*grpc.ClientConn, err }() t.Cleanup(func() { t.Log("Gracefully stopping testSrv") - testSrv.GracefulStop() + testSrv.Stop() }) opts = append(opts, diff --git a/proxy/testservice/test.pb.go b/proxy/testservice/test.pb.go index ff4b0d8..5654ce5 100644 --- a/proxy/testservice/test.pb.go +++ b/proxy/testservice/test.pb.go @@ -1,17 +1,18 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0-devel -// protoc v3.15.5 -// source: test.proto +// protoc-gen-go v1.35.1 +// protoc v5.28.2 +// source: proxy/testservice/test.proto package testservice import ( + reflect "reflect" + sync "sync" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" - reflect "reflect" - sync "sync" ) const ( @@ -31,11 +32,9 @@ type PingRequest struct { func (x *PingRequest) Reset() { *x = PingRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_test_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proxy_testservice_test_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PingRequest) String() string { @@ -45,8 +44,8 @@ func (x *PingRequest) String() string { func (*PingRequest) ProtoMessage() {} func (x *PingRequest) ProtoReflect() protoreflect.Message { - mi := &file_test_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_proxy_testservice_test_proto_msgTypes[0] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -58,7 +57,7 @@ func (x *PingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PingRequest.ProtoReflect.Descriptor instead. func (*PingRequest) Descriptor() ([]byte, []int) { - return file_test_proto_rawDescGZIP(), []int{0} + return file_proxy_testservice_test_proto_rawDescGZIP(), []int{0} } func (x *PingRequest) GetValue() string { @@ -79,11 +78,9 @@ type PingResponse struct { func (x *PingResponse) Reset() { *x = PingResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_test_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_proxy_testservice_test_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PingResponse) String() string { @@ -93,8 +90,8 @@ func (x *PingResponse) String() string { func (*PingResponse) ProtoMessage() {} func (x *PingResponse) ProtoReflect() protoreflect.Message { - mi := &file_test_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_proxy_testservice_test_proto_msgTypes[1] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -106,7 +103,7 @@ func (x *PingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PingResponse.ProtoReflect.Descriptor instead. func (*PingResponse) Descriptor() ([]byte, []int) { - return file_test_proto_rawDescGZIP(), []int{1} + return file_proxy_testservice_test_proto_rawDescGZIP(), []int{1} } func (x *PingResponse) GetValue() string { @@ -123,69 +120,70 @@ func (x *PingResponse) GetCounter() int32 { return 0 } -var File_test_proto protoreflect.FileDescriptor +var File_proxy_testservice_test_proto protoreflect.FileDescriptor -var file_test_proto_rawDesc = []byte{ - 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x6d, 0x77, - 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x23, 0x0a, 0x0b, - 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x22, 0x3e, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x65, - 0x72, 0x32, 0x8d, 0x03, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x46, 0x0a, 0x09, 0x50, 0x69, 0x6e, 0x67, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, - 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x04, 0x50, 0x69, 0x6e, - 0x67, 0x12, 0x1e, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x50, 0x69, 0x6e, 0x67, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x1e, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x08, 0x50, - 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, - 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, - 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x0a, - 0x50, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x6d, 0x77, 0x69, - 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x77, 0x69, - 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, - 0x01, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +var file_proxy_testservice_test_proto_rawDesc = []byte{ + 0x0a, 0x1c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, + 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x23, + 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x65, 0x72, 0x32, 0x8d, 0x03, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x46, 0x0a, 0x09, 0x50, 0x69, 0x6e, 0x67, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, + 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x04, 0x50, + 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x50, 0x69, 0x6e, 0x67, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x6d, 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, + 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, + 0x08, 0x50, 0x69, 0x6e, 0x67, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1e, 0x2e, 0x6d, 0x77, 0x69, 0x74, + 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x77, 0x69, 0x74, + 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, + 0x0a, 0x0a, 0x50, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x6d, + 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, + 0x77, 0x69, 0x74, 0x6b, 0x6f, 0x77, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, + 0x01, 0x30, 0x01, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x2e, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x2e, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2d, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, + 0x69, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_test_proto_rawDescOnce sync.Once - file_test_proto_rawDescData = file_test_proto_rawDesc + file_proxy_testservice_test_proto_rawDescOnce sync.Once + file_proxy_testservice_test_proto_rawDescData = file_proxy_testservice_test_proto_rawDesc ) -func file_test_proto_rawDescGZIP() []byte { - file_test_proto_rawDescOnce.Do(func() { - file_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_proto_rawDescData) +func file_proxy_testservice_test_proto_rawDescGZIP() []byte { + file_proxy_testservice_test_proto_rawDescOnce.Do(func() { + file_proxy_testservice_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_proxy_testservice_test_proto_rawDescData) }) - return file_test_proto_rawDescData + return file_proxy_testservice_test_proto_rawDescData } -var file_test_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_test_proto_goTypes = []interface{}{ +var file_proxy_testservice_test_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_proxy_testservice_test_proto_goTypes = []any{ (*PingRequest)(nil), // 0: mwitkow.testproto.PingRequest (*PingResponse)(nil), // 1: mwitkow.testproto.PingResponse (*emptypb.Empty)(nil), // 2: google.protobuf.Empty } -var file_test_proto_depIdxs = []int32{ +var file_proxy_testservice_test_proto_depIdxs = []int32{ 2, // 0: mwitkow.testproto.TestService.PingEmpty:input_type -> google.protobuf.Empty 0, // 1: mwitkow.testproto.TestService.Ping:input_type -> mwitkow.testproto.PingRequest 0, // 2: mwitkow.testproto.TestService.PingError:input_type -> mwitkow.testproto.PingRequest @@ -203,53 +201,27 @@ var file_test_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for field type_name } -func init() { file_test_proto_init() } -func file_test_proto_init() { - if File_test_proto != nil { +func init() { file_proxy_testservice_test_proto_init() } +func file_proxy_testservice_test_proto_init() { + if File_proxy_testservice_test_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PingRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PingResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_test_proto_rawDesc, + RawDescriptor: file_proxy_testservice_test_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_test_proto_goTypes, - DependencyIndexes: file_test_proto_depIdxs, - MessageInfos: file_test_proto_msgTypes, + GoTypes: file_proxy_testservice_test_proto_goTypes, + DependencyIndexes: file_proxy_testservice_test_proto_depIdxs, + MessageInfos: file_proxy_testservice_test_proto_msgTypes, }.Build() - File_test_proto = out.File - file_test_proto_rawDesc = nil - file_test_proto_goTypes = nil - file_test_proto_depIdxs = nil + File_proxy_testservice_test_proto = out.File + file_proxy_testservice_test_proto_rawDesc = nil + file_proxy_testservice_test_proto_goTypes = nil + file_proxy_testservice_test_proto_depIdxs = nil } diff --git a/proxy/testservice/test_grpc.pb.go b/proxy/testservice/test_grpc.pb.go index 473c361..fdbbd5d 100644 --- a/proxy/testservice/test_grpc.pb.go +++ b/proxy/testservice/test_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.28.2 +// source: proxy/testservice/test.proto package testservice @@ -12,8 +16,16 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + TestService_PingEmpty_FullMethodName = "/mwitkow.testproto.TestService/PingEmpty" + TestService_Ping_FullMethodName = "/mwitkow.testproto.TestService/Ping" + TestService_PingError_FullMethodName = "/mwitkow.testproto.TestService/PingError" + TestService_PingList_FullMethodName = "/mwitkow.testproto.TestService/PingList" + TestService_PingStream_FullMethodName = "/mwitkow.testproto.TestService/PingStream" +) // TestServiceClient is the client API for TestService service. // @@ -22,8 +34,8 @@ type TestServiceClient interface { PingEmpty(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*PingResponse, error) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) PingError(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - PingList(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (TestService_PingListClient, error) - PingStream(ctx context.Context, opts ...grpc.CallOption) (TestService_PingStreamClient, error) + PingList(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[PingResponse], error) + PingStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[PingRequest, PingResponse], error) } type testServiceClient struct { @@ -35,8 +47,9 @@ func NewTestServiceClient(cc grpc.ClientConnInterface) TestServiceClient { } func (c *testServiceClient) PingEmpty(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*PingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PingResponse) - err := c.cc.Invoke(ctx, "/mwitkow.testproto.TestService/PingEmpty", in, out, opts...) + err := c.cc.Invoke(ctx, TestService_PingEmpty_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -44,8 +57,9 @@ func (c *testServiceClient) PingEmpty(ctx context.Context, in *emptypb.Empty, op } func (c *testServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PingResponse) - err := c.cc.Invoke(ctx, "/mwitkow.testproto.TestService/Ping", in, out, opts...) + err := c.cc.Invoke(ctx, TestService_Ping_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -53,20 +67,22 @@ func (c *testServiceClient) Ping(ctx context.Context, in *PingRequest, opts ...g } func (c *testServiceClient) PingError(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, "/mwitkow.testproto.TestService/PingError", in, out, opts...) + err := c.cc.Invoke(ctx, TestService_PingError_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *testServiceClient) PingList(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (TestService_PingListClient, error) { - stream, err := c.cc.NewStream(ctx, &TestService_ServiceDesc.Streams[0], "/mwitkow.testproto.TestService/PingList", opts...) +func (c *testServiceClient) PingList(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[PingResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &TestService_ServiceDesc.Streams[0], TestService_PingList_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &testServicePingListClient{stream} + x := &grpc.GenericClientStream[PingRequest, PingResponse]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -76,69 +92,40 @@ func (c *testServiceClient) PingList(ctx context.Context, in *PingRequest, opts return x, nil } -type TestService_PingListClient interface { - Recv() (*PingResponse, error) - grpc.ClientStream -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type TestService_PingListClient = grpc.ServerStreamingClient[PingResponse] -type testServicePingListClient struct { - grpc.ClientStream -} - -func (x *testServicePingListClient) Recv() (*PingResponse, error) { - m := new(PingResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *testServiceClient) PingStream(ctx context.Context, opts ...grpc.CallOption) (TestService_PingStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &TestService_ServiceDesc.Streams[1], "/mwitkow.testproto.TestService/PingStream", opts...) +func (c *testServiceClient) PingStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[PingRequest, PingResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &TestService_ServiceDesc.Streams[1], TestService_PingStream_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &testServicePingStreamClient{stream} + x := &grpc.GenericClientStream[PingRequest, PingResponse]{ClientStream: stream} return x, nil } -type TestService_PingStreamClient interface { - Send(*PingRequest) error - Recv() (*PingResponse, error) - grpc.ClientStream -} - -type testServicePingStreamClient struct { - grpc.ClientStream -} - -func (x *testServicePingStreamClient) Send(m *PingRequest) error { - return x.ClientStream.SendMsg(m) -} - -func (x *testServicePingStreamClient) Recv() (*PingResponse, error) { - m := new(PingResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type TestService_PingStreamClient = grpc.BidiStreamingClient[PingRequest, PingResponse] // TestServiceServer is the server API for TestService service. // All implementations must embed UnimplementedTestServiceServer -// for forward compatibility +// for forward compatibility. type TestServiceServer interface { PingEmpty(context.Context, *emptypb.Empty) (*PingResponse, error) Ping(context.Context, *PingRequest) (*PingResponse, error) PingError(context.Context, *PingRequest) (*emptypb.Empty, error) - PingList(*PingRequest, TestService_PingListServer) error - PingStream(TestService_PingStreamServer) error + PingList(*PingRequest, grpc.ServerStreamingServer[PingResponse]) error + PingStream(grpc.BidiStreamingServer[PingRequest, PingResponse]) error mustEmbedUnimplementedTestServiceServer() } -// UnimplementedTestServiceServer must be embedded to have forward compatible implementations. -type UnimplementedTestServiceServer struct { -} +// UnimplementedTestServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedTestServiceServer struct{} func (UnimplementedTestServiceServer) PingEmpty(context.Context, *emptypb.Empty) (*PingResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PingEmpty not implemented") @@ -149,13 +136,14 @@ func (UnimplementedTestServiceServer) Ping(context.Context, *PingRequest) (*Ping func (UnimplementedTestServiceServer) PingError(context.Context, *PingRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method PingError not implemented") } -func (UnimplementedTestServiceServer) PingList(*PingRequest, TestService_PingListServer) error { +func (UnimplementedTestServiceServer) PingList(*PingRequest, grpc.ServerStreamingServer[PingResponse]) error { return status.Errorf(codes.Unimplemented, "method PingList not implemented") } -func (UnimplementedTestServiceServer) PingStream(TestService_PingStreamServer) error { +func (UnimplementedTestServiceServer) PingStream(grpc.BidiStreamingServer[PingRequest, PingResponse]) error { return status.Errorf(codes.Unimplemented, "method PingStream not implemented") } func (UnimplementedTestServiceServer) mustEmbedUnimplementedTestServiceServer() {} +func (UnimplementedTestServiceServer) testEmbeddedByValue() {} // UnsafeTestServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to TestServiceServer will @@ -165,6 +153,13 @@ type UnsafeTestServiceServer interface { } func RegisterTestServiceServer(s grpc.ServiceRegistrar, srv TestServiceServer) { + // If the following call pancis, it indicates UnimplementedTestServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&TestService_ServiceDesc, srv) } @@ -178,7 +173,7 @@ func _TestService_PingEmpty_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mwitkow.testproto.TestService/PingEmpty", + FullMethod: TestService_PingEmpty_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(TestServiceServer).PingEmpty(ctx, req.(*emptypb.Empty)) @@ -196,7 +191,7 @@ func _TestService_Ping_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mwitkow.testproto.TestService/Ping", + FullMethod: TestService_Ping_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(TestServiceServer).Ping(ctx, req.(*PingRequest)) @@ -214,7 +209,7 @@ func _TestService_PingError_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/mwitkow.testproto.TestService/PingError", + FullMethod: TestService_PingError_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(TestServiceServer).PingError(ctx, req.(*PingRequest)) @@ -227,47 +222,18 @@ func _TestService_PingList_Handler(srv interface{}, stream grpc.ServerStream) er if err := stream.RecvMsg(m); err != nil { return err } - return srv.(TestServiceServer).PingList(m, &testServicePingListServer{stream}) + return srv.(TestServiceServer).PingList(m, &grpc.GenericServerStream[PingRequest, PingResponse]{ServerStream: stream}) } -type TestService_PingListServer interface { - Send(*PingResponse) error - grpc.ServerStream -} - -type testServicePingListServer struct { - grpc.ServerStream -} - -func (x *testServicePingListServer) Send(m *PingResponse) error { - return x.ServerStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type TestService_PingListServer = grpc.ServerStreamingServer[PingResponse] func _TestService_PingStream_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(TestServiceServer).PingStream(&testServicePingStreamServer{stream}) + return srv.(TestServiceServer).PingStream(&grpc.GenericServerStream[PingRequest, PingResponse]{ServerStream: stream}) } -type TestService_PingStreamServer interface { - Send(*PingResponse) error - Recv() (*PingRequest, error) - grpc.ServerStream -} - -type testServicePingStreamServer struct { - grpc.ServerStream -} - -func (x *testServicePingStreamServer) Send(m *PingResponse) error { - return x.ServerStream.SendMsg(m) -} - -func (x *testServicePingStreamServer) Recv() (*PingRequest, error) { - m := new(PingRequest) - if err := x.ServerStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type TestService_PingStreamServer = grpc.BidiStreamingServer[PingRequest, PingResponse] // TestService_ServiceDesc is the grpc.ServiceDesc for TestService service. // It's only intended for direct use with grpc.RegisterService, @@ -302,5 +268,5 @@ var TestService_ServiceDesc = grpc.ServiceDesc{ ClientStreams: true, }, }, - Metadata: "test.proto", + Metadata: "proxy/testservice/test.proto", } diff --git a/proxy/testservice/test_vtproto.pb.go b/proxy/testservice/test_vtproto.pb.go index ca62a31..1e2a9fd 100644 --- a/proxy/testservice/test_vtproto.pb.go +++ b/proxy/testservice/test_vtproto.pb.go @@ -6,9 +6,10 @@ package testservice import ( fmt "fmt" + io "io" + protohelpers "github.com/planetscale/vtprotobuf/protohelpers" protoimpl "google.golang.org/protobuf/runtime/protoimpl" - io "io" ) const (