diff options
Diffstat (limited to 'internal/praefect/grpc-proxy/proxy/handler.go')
-rw-r--r-- | internal/praefect/grpc-proxy/proxy/handler.go | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/internal/praefect/grpc-proxy/proxy/handler.go b/internal/praefect/grpc-proxy/proxy/handler.go index ced9388b9..69012235e 100644 --- a/internal/praefect/grpc-proxy/proxy/handler.go +++ b/internal/praefect/grpc-proxy/proxy/handler.go @@ -24,6 +24,34 @@ var ( } ) +// RegisterStreamHandlers sets up stream handlers for a set of gRPC methods for a given service. +// streamers is a map of method to grpc.StreamHandler eg: +// +// streamHandler := func(srv interface{}, stream ServerStream) error { +// /** do some stuff **/ +// return nil +// } +// RegisterStreamHandlers(grpcServer, "MyGrpcService", map[string]grpc.StreamHandler{"Method1": streamHandler}) +// note: multiple calls with the same serviceName will result in a fatal +func RegisterStreamHandlers(server *grpc.Server, serviceName string, streamers map[string]grpc.StreamHandler) { + desc := &grpc.ServiceDesc{ + ServiceName: serviceName, + HandlerType: (*interface{})(nil), + } + + for methodName, streamer := range streamers { + streamDesc := grpc.StreamDesc{ + StreamName: methodName, + Handler: streamer, + ServerStreams: true, + ClientStreams: true, + } + desc.Streams = append(desc.Streams, streamDesc) + } + + server.RegisterService(desc, struct{}{}) +} + // 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 codegenerated pb.go file. // |