github.com/ari-anchor/sei-tendermint@v0.0.0-20230519144642-dc826b7b56bb/abci/server/grpc_server.go (about) 1 package server 2 3 import ( 4 "context" 5 "net" 6 7 "google.golang.org/grpc" 8 9 "github.com/ari-anchor/sei-tendermint/abci/types" 10 "github.com/ari-anchor/sei-tendermint/libs/log" 11 tmnet "github.com/ari-anchor/sei-tendermint/libs/net" 12 "github.com/ari-anchor/sei-tendermint/libs/service" 13 ) 14 15 type GRPCServer struct { 16 service.BaseService 17 logger log.Logger 18 19 proto string 20 addr string 21 server *grpc.Server 22 23 app types.Application 24 } 25 26 // NewGRPCServer returns a new gRPC ABCI server 27 func NewGRPCServer(logger log.Logger, protoAddr string, app types.Application) service.Service { 28 proto, addr := tmnet.ProtocolAndAddress(protoAddr) 29 s := &GRPCServer{ 30 logger: logger, 31 proto: proto, 32 addr: addr, 33 app: app, 34 } 35 s.BaseService = *service.NewBaseService(logger, "ABCIServer", s) 36 return s 37 } 38 39 // OnStart starts the gRPC service. 40 func (s *GRPCServer) OnStart(ctx context.Context) error { 41 ln, err := net.Listen(s.proto, s.addr) 42 if err != nil { 43 return err 44 } 45 46 s.server = grpc.NewServer() 47 types.RegisterABCIApplicationServer(s.server, &gRPCApplication{Application: s.app}) 48 49 s.logger.Info("Listening", "proto", s.proto, "addr", s.addr) 50 go func() { 51 go func() { 52 <-ctx.Done() 53 s.server.GracefulStop() 54 }() 55 56 if err := s.server.Serve(ln); err != nil { 57 s.logger.Error("error serving gRPC server", "err", err) 58 } 59 }() 60 return nil 61 } 62 63 // OnStop stops the gRPC server. 64 func (s *GRPCServer) OnStop() { s.server.Stop() } 65 66 //------------------------------------------------------- 67 68 // gRPCApplication is a gRPC shim for Application 69 type gRPCApplication struct { 70 types.Application 71 } 72 73 func (app *gRPCApplication) Echo(_ context.Context, req *types.RequestEcho) (*types.ResponseEcho, error) { 74 return &types.ResponseEcho{Message: req.Message}, nil 75 } 76 77 func (app *gRPCApplication) Flush(_ context.Context, req *types.RequestFlush) (*types.ResponseFlush, error) { 78 return &types.ResponseFlush{}, nil 79 } 80 81 func (app *gRPCApplication) Commit(ctx context.Context, req *types.RequestCommit) (*types.ResponseCommit, error) { 82 return app.Application.Commit(ctx) 83 }