package core_grpc import ( "fmt" "net" "strings" "time" "golang.org/x/net/netutil" "google.golang.org/grpc" cmn "github.com/tendermint/tendermint/libs/common" ) // Config is an gRPC server configuration. type Config struct { MaxOpenConnections int } // StartGRPCServer starts a new gRPC BroadcastAPIServer, listening on // protoAddr, in a goroutine. Returns a listener and an error, if it fails to // parse an address. func StartGRPCServer(protoAddr string, config Config) (net.Listener, error) { parts := strings.SplitN(protoAddr, "://", 2) if len(parts) != 2 { return nil, fmt.Errorf("Invalid listen address for grpc server (did you forget a tcp:// prefix?) : %s", protoAddr) } proto, addr := parts[0], parts[1] ln, err := net.Listen(proto, addr) if err != nil { return nil, err } if config.MaxOpenConnections > 0 { ln = netutil.LimitListener(ln, config.MaxOpenConnections) } grpcServer := grpc.NewServer() RegisterBroadcastAPIServer(grpcServer, &broadcastAPI{}) go grpcServer.Serve(ln) // nolint: errcheck return ln, nil } // StartGRPCClient dials the gRPC server using protoAddr and returns a new // BroadcastAPIClient. func StartGRPCClient(protoAddr string) BroadcastAPIClient { conn, err := grpc.Dial(protoAddr, grpc.WithInsecure(), grpc.WithDialer(dialerFunc)) if err != nil { panic(err) } return NewBroadcastAPIClient(conn) } func dialerFunc(addr string, timeout time.Duration) (net.Conn, error) { return cmn.Connect(addr) }