diff --git a/go.mod b/go.mod index 1993ed041..f82ba9f5f 100644 --- a/go.mod +++ b/go.mod @@ -16,7 +16,7 @@ require ( github.com/multiformats/go-multihash v0.0.13 github.com/nspcc-dev/hrw v1.0.9 github.com/nspcc-dev/neo-go v0.90.0 - github.com/nspcc-dev/neofs-api-go v1.3.1-0.20200820112910-89e79ebe72b0 + github.com/nspcc-dev/neofs-api-go v1.3.1-0.20200821125006-afd2ce0400ec github.com/nspcc-dev/neofs-crypto v0.3.0 github.com/nspcc-dev/netmap v1.7.0 github.com/nspcc-dev/tzhash v1.4.0 // indirect diff --git a/go.sum b/go.sum index 5f3644aee..5eb9c3e80 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -165,6 +166,7 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -191,6 +193,7 @@ github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -299,6 +302,8 @@ github.com/nspcc-dev/neofs-api-go v1.3.0 h1:w0wYIXzPJIElwhqahnQw/1NKiHxjRZKJhDUM github.com/nspcc-dev/neofs-api-go v1.3.0/go.mod h1:NlCjqm//ZRXBNlxtrilLM1GgkRz0mv4V3pdX8OcGoLw= github.com/nspcc-dev/neofs-api-go v1.3.1-0.20200820112910-89e79ebe72b0 h1:aaDAx0xezfCzpD7NrmaJTLDHs58t5JM4ZV3ttyMJicY= github.com/nspcc-dev/neofs-api-go v1.3.1-0.20200820112910-89e79ebe72b0/go.mod h1:6euXsb8tS06O9z3iuM49FrKeOhHO66R2DW8T8E1Wfl8= +github.com/nspcc-dev/neofs-api-go v1.3.1-0.20200821125006-afd2ce0400ec h1:RiOp+9omHGk4y70GHaC4rhnCe/3TPoFR/YmdL/5Ke1c= +github.com/nspcc-dev/neofs-api-go v1.3.1-0.20200821125006-afd2ce0400ec/go.mod h1:6euXsb8tS06O9z3iuM49FrKeOhHO66R2DW8T8E1Wfl8= github.com/nspcc-dev/neofs-crypto v0.2.0/go.mod h1:F/96fUzPM3wR+UGsPi3faVNmFlA9KAEAUQR7dMxZmNA= github.com/nspcc-dev/neofs-crypto v0.2.3 h1:aca3X2aly92ENRbFK+kH6Hd+J9EQ4Eu6XMVoITSIKtc= github.com/nspcc-dev/neofs-crypto v0.2.3/go.mod h1:8w16GEJbH6791ktVqHN9YRNH3s9BEEKYxGhlFnp0cDw= @@ -421,6 +426,7 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -446,6 +452,7 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -526,6 +533,7 @@ golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -610,6 +618,7 @@ google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEt google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -668,6 +677,7 @@ gopkg.in/yaml.v2 v2.2.5 h1:ymVxjfMaHvXD8RqPRmzHHsB3VvucivSkIAvJFDI5O3c= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/network/transport/accounting/grpc/.gitkeep b/pkg/network/transport/accounting/grpc/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/pkg/network/transport/accounting/grpc/service.go b/pkg/network/transport/accounting/grpc/service.go new file mode 100644 index 000000000..b2fd0e413 --- /dev/null +++ b/pkg/network/transport/accounting/grpc/service.go @@ -0,0 +1,32 @@ +package accounting + +import ( + "context" + + "github.com/nspcc-dev/neofs-api-go/v2/accounting" + accountingGRPC "github.com/nspcc-dev/neofs-api-go/v2/accounting/grpc" +) + +// Server wraps NeoFS API Accounting service and +// provides gRPC Accounting service server interface. +type Server struct { + srv accounting.Service +} + +// New creates, initializes and returns Server instance. +func New(c accounting.Service) *Server { + return &Server{ + srv: c, + } +} + +// Balance converts gRPC BalanceRequest message and passes it to internal Accounting service. +func (s *Server) Balance(ctx context.Context, req *accountingGRPC.BalanceRequest) (*accountingGRPC.BalanceResponse, error) { + resp, err := s.srv.Balance(ctx, accounting.BalanceRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return accounting.BalanceResponseToGRPCMessage(resp), nil +} diff --git a/pkg/network/transport/container/grpc/.gitkeep b/pkg/network/transport/container/grpc/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/pkg/network/transport/container/grpc/service.go b/pkg/network/transport/container/grpc/service.go new file mode 100644 index 000000000..d4583111a --- /dev/null +++ b/pkg/network/transport/container/grpc/service.go @@ -0,0 +1,87 @@ +package container + +import ( + "context" + + "github.com/nspcc-dev/neofs-api-go/v2/container" + containerGRPC "github.com/nspcc-dev/neofs-api-go/v2/container/grpc" +) + +// Server wraps NeoFS API Container service and +// provides gRPC Container service server interface. +type Server struct { + srv container.Service +} + +// New creates, initializes and returns Server instance. +func New(c container.Service) *Server { + return &Server{ + srv: c, + } +} + +// Put converts gRPC PutRequest message and passes it to internal Container service. +func (s *Server) Put(ctx context.Context, req *containerGRPC.PutRequest) (*containerGRPC.PutResponse, error) { + resp, err := s.srv.Put(ctx, container.PutRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return container.PutResponseToGRPCMessage(resp), nil +} + +// Delete converts gRPC DeleteRequest message and passes it to internal Container service. +func (s *Server) Delete(ctx context.Context, req *containerGRPC.DeleteRequest) (*containerGRPC.DeleteResponse, error) { + resp, err := s.srv.Delete(ctx, container.DeleteRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return container.DeleteResponseToGRPCMessage(resp), nil +} + +// Get converts gRPC GetRequest message and passes it to internal Container service. +func (s *Server) Get(ctx context.Context, req *containerGRPC.GetRequest) (*containerGRPC.GetResponse, error) { + resp, err := s.srv.Get(ctx, container.GetRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return container.GetResponseToGRPCMessage(resp), nil +} + +// List converts gRPC ListRequest message and passes it to internal Container service. +func (s *Server) List(ctx context.Context, req *containerGRPC.ListRequest) (*containerGRPC.ListResponse, error) { + resp, err := s.srv.List(ctx, container.ListRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return container.ListResponseToGRPCMessage(resp), nil +} + +// SetExtendedACL converts gRPC SetExtendedACLRequest message and passes it to internal Container service. +func (s *Server) SetExtendedACL(ctx context.Context, req *containerGRPC.SetExtendedACLRequest) (*containerGRPC.SetExtendedACLResponse, error) { + resp, err := s.srv.SetExtendedACL(ctx, container.SetExtendedACLRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return container.SetExtendedACLResponseToGRPCMessage(resp), nil +} + +// GetExtendedACL converts gRPC GetExtendedACLRequest message and passes it to internal Container service. +func (s *Server) GetExtendedACL(ctx context.Context, req *containerGRPC.GetExtendedACLRequest) (*containerGRPC.GetExtendedACLResponse, error) { + resp, err := s.srv.GetExtendedACL(ctx, container.GetExtendedACLRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return container.GetExtendedACLResponseToGRPCMessage(resp), nil +} diff --git a/pkg/network/transport/object/grpc/.gitkeep b/pkg/network/transport/object/grpc/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/pkg/network/transport/object/grpc/service.go b/pkg/network/transport/object/grpc/service.go new file mode 100644 index 000000000..a993c6758 --- /dev/null +++ b/pkg/network/transport/object/grpc/service.go @@ -0,0 +1,159 @@ +package object + +import ( + "context" + "io" + + "github.com/nspcc-dev/neofs-api-go/v2/object" + objectGRPC "github.com/nspcc-dev/neofs-api-go/v2/object/grpc" +) + +// Server wraps NeoFS API Object service and +// provides gRPC Object service server interface. +type Server struct { + srv object.Service +} + +// New creates, initializes and returns Server instance. +func New(c object.Service) *Server { + return &Server{ + srv: c, + } +} + +// Get converts gRPC GetRequest message, opens internal Object service Get stream and overtakes its data +// to gRPC stream. +func (s *Server) Get(req *objectGRPC.GetRequest, gStream objectGRPC.ObjectService_GetServer) error { + stream, err := s.srv.Get(gStream.Context(), object.GetRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return err + } + + for { + r, err := stream.Recv() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := gStream.Send(object.GetResponseToGRPCMessage(r)); err != nil { + return err + } + } +} + +// Put opens internal Object service Put stream and overtakes data from gRPC stream to it. +func (s *Server) Put(gStream objectGRPC.ObjectService_PutServer) error { + stream, err := s.srv.Put(gStream.Context()) + if err != nil { + // TODO: think about how we transport errors through gRPC + return err + } + + for { + req, err := gStream.Recv() + if err == nil { + if err := stream.Send(object.PutRequestFromGRPCMessage(req)); err != nil { + return err + } + } + + if err == io.EOF { + resp, err := stream.CloseAndRecv() + if err != nil { + return err + } + + return gStream.SendAndClose(object.PutResponseToGRPCMessage(resp)) + } + + return err + } +} + +// Delete converts gRPC DeleteRequest message and passes it to internal Object service. +func (s *Server) Delete(ctx context.Context, req *objectGRPC.DeleteRequest) (*objectGRPC.DeleteResponse, error) { + resp, err := s.srv.Delete(ctx, object.DeleteRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return object.DeleteResponseToGRPCMessage(resp), nil +} + +// Head converts gRPC HeadRequest message and passes it to internal Object service. +func (s *Server) Head(ctx context.Context, req *objectGRPC.HeadRequest) (*objectGRPC.HeadResponse, error) { + resp, err := s.srv.Head(ctx, object.HeadRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return object.HeadResponseToGRPCMessage(resp), nil +} + +// Search converts gRPC SearchRequest message, opens internal Object service Search stream and overtakes its data +// to gRPC stream. +func (s *Server) Search(req *objectGRPC.SearchRequest, gStream objectGRPC.ObjectService_SearchServer) error { + stream, err := s.srv.Search(gStream.Context(), object.SearchRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return err + } + + for { + r, err := stream.Recv() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := gStream.Send(object.SearchResponseToGRPCMessage(r)); err != nil { + return err + } + } +} + +// GetRange converts gRPC GetRangeRequest message, opens internal Object service Search stream and overtakes its data +// to gRPC stream. +func (s *Server) GetRange(req *objectGRPC.GetRangeRequest, gStream objectGRPC.ObjectService_GetRangeServer) error { + stream, err := s.srv.GetRange(gStream.Context(), object.GetRangeRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return err + } + + for { + r, err := stream.Recv() + if err != nil { + if err == io.EOF { + return nil + } + + return err + } + + if err := gStream.Send(object.GetRangeResponseToGRPCMessage(r)); err != nil { + return err + } + } +} + +// GetRangeHash converts gRPC GetRangeHashRequest message and passes it to internal Object service. +func (s *Server) GetRangeHash(ctx context.Context, req *objectGRPC.GetRangeHashRequest) (*objectGRPC.GetRangeHashResponse, error) { + resp, err := s.srv.GetRangeHash(ctx, object.GetRangeHashRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return object.GetRangeHashResponseToGRPCMessage(resp), nil +} diff --git a/pkg/network/transport/session/grpc/.gitkeep b/pkg/network/transport/session/grpc/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/pkg/network/transport/session/grpc/service.go b/pkg/network/transport/session/grpc/service.go new file mode 100644 index 000000000..3a248dbc8 --- /dev/null +++ b/pkg/network/transport/session/grpc/service.go @@ -0,0 +1,32 @@ +package accounting + +import ( + "context" + + "github.com/nspcc-dev/neofs-api-go/v2/session" + sessionGRPC "github.com/nspcc-dev/neofs-api-go/v2/session/grpc" +) + +// Server wraps NeoFS API Session service and +// provides gRPC Session service server interface. +type Server struct { + srv session.Service +} + +// New creates, initializes and returns Server instance. +func New(c session.Service) *Server { + return &Server{ + srv: c, + } +} + +// Create converts gRPC CreateRequest message and passes it to internal Session service. +func (s *Server) Create(ctx context.Context, req *sessionGRPC.CreateRequest) (*sessionGRPC.CreateResponse, error) { + resp, err := s.srv.Create(ctx, session.CreateRequestFromGRPCMessage(req)) + if err != nil { + // TODO: think about how we transport errors through gRPC + return nil, err + } + + return session.CreateResponseToGRPCMessage(resp), nil +}