package server import ( "net" "google.golang.org/grpc" "github.com/tendermint/tendermint/abci/types" tmnet "github.com/tendermint/tendermint/libs/net" "github.com/tendermint/tendermint/libs/service" ) type GRPCServer struct { service.BaseService proto string addr string listener net.Listener server *grpc.Server app types.ABCIApplicationServer } // NewGRPCServer returns a new gRPC ABCI server func NewGRPCServer(protoAddr string, app types.ABCIApplicationServer) service.Service { proto, addr := tmnet.ProtocolAndAddress(protoAddr) s := &GRPCServer{ proto: proto, addr: addr, listener: nil, app: app, } s.BaseService = *service.NewBaseService(nil, "ABCIServer", s) return s } // OnStart starts the gRPC service func (s *GRPCServer) OnStart() error { if err := s.BaseService.OnStart(); err != nil { return err } ln, err := net.Listen(s.proto, s.addr) if err != nil { return err } s.Logger.Info("Listening", "proto", s.proto, "addr", s.addr) s.listener = ln s.server = grpc.NewServer() types.RegisterABCIApplicationServer(s.server, s.app) go s.server.Serve(s.listener) return nil } // OnStop stops the gRPC server func (s *GRPCServer) OnStop() { s.BaseService.OnStop() s.server.Stop() }