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  }