[#263] Implement client for exchanging raw messages using gRPC protocol
Implement gRPC client that can uniformly execute any RPC on the remote server. In the primary implementation, the client is a thin wrapper over gRPC client connection that is required to create the client. In the future, it is planned to expand the library with convenient functionality. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
ae2fb263f1
commit
cf765a61a6
7 changed files with 271 additions and 0 deletions
65
rpc/grpc/init.go
Normal file
65
rpc/grpc/init.go
Normal file
|
@ -0,0 +1,65 @@
|
|||
package grpc
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/nspcc-dev/neofs-api-go/rpc/common"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
// Message represents raw gRPC message.
|
||||
type Message interface{}
|
||||
|
||||
// MessageReadWriter is a component interface
|
||||
// for transmitting raw messages over gRPC protocol.
|
||||
type MessageReadWriter interface {
|
||||
// ReadMessage reads the next message from the remote server,
|
||||
// and writes it to the argument.
|
||||
ReadMessage(Message) error
|
||||
|
||||
// WriteMessage sends message from argument to remote server.
|
||||
WriteMessage(Message) error
|
||||
|
||||
// Closes the communication session with the remote server.
|
||||
//
|
||||
// All calls to send/receive messages must be done before closing.
|
||||
io.Closer
|
||||
}
|
||||
|
||||
type streamWrapper struct {
|
||||
grpc.ClientStream
|
||||
}
|
||||
|
||||
func (w streamWrapper) ReadMessage(m Message) error {
|
||||
return w.ClientStream.RecvMsg(m)
|
||||
}
|
||||
|
||||
func (w streamWrapper) WriteMessage(m Message) error {
|
||||
return w.ClientStream.SendMsg(m)
|
||||
}
|
||||
|
||||
func (w *streamWrapper) Close() error {
|
||||
return w.ClientStream.CloseSend()
|
||||
}
|
||||
|
||||
// Init initiates a messaging session within the RPC configured by options.
|
||||
func (c *Client) Init(info common.CallMethodInfo, opts ...CallOption) (MessageReadWriter, error) {
|
||||
prm := defaultCallParameters()
|
||||
|
||||
for _, opt := range opts {
|
||||
opt(prm)
|
||||
}
|
||||
|
||||
stream, err := c.con.NewStream(prm.ctx, &grpc.StreamDesc{
|
||||
StreamName: info.Name,
|
||||
ServerStreams: info.ServerStream(),
|
||||
ClientStreams: info.ClientStream(),
|
||||
}, toMethodName(info))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &streamWrapper{
|
||||
ClientStream: stream,
|
||||
}, nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue