/* Package server is used to start a new ABCI server. It defines the struct for gRPC server settings, and functions for: * Starting a new gRPC server * Stopping a gRPC server */ package server import ( "net" "strings" "google.golang.org/grpc" "github.com/tendermint/abci/types" cmn "github.com/tendermint/tmlibs/common" ) // var maxNumberConnections = 2 //GRPCServer is used to set the protocol and address for gRPC. type GRPCServer struct { cmn.BaseService proto string addr string listener net.Listener server *grpc.Server app types.ABCIApplicationServer } //NewGRPCServer allows setting up a new gRPC ABCI server. func NewGRPCServer(protoAddr string, app types.ABCIApplicationServer) (cmn.Service, error) { parts := strings.SplitN(protoAddr, "://", 2) proto, addr := parts[0], parts[1] s := &GRPCServer{ proto: proto, addr: addr, listener: nil, app: app, } s.BaseService = *cmn.NewBaseService(nil, "ABCIServer", s) _, err := s.Start() // Just start it return s, err } //Onstart registers a new gRPC service and tells that service to listen on the port that is set in NewGRPCServer. func (s *GRPCServer) OnStart() error { s.BaseService.OnStart() ln, err := net.Listen(s.proto, s.addr) if err != nil { return err } s.listener = ln s.server = grpc.NewServer() types.RegisterABCIApplicationServer(s.server, s.app) go s.server.Serve(s.listener) return nil } //OnStop is called when a gRPC server is stopped. func (s *GRPCServer) OnStop() { s.BaseService.OnStop() s.server.Stop() }