github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/server/grpc/grpc.go (about)

     1  package grpc
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"time"
     7  
     8  	"github.com/fibonacci-chain/fbc/libs/tendermint/node"
     9  
    10  	app2 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server/types"
    11  
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    14  	interfacetypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec/types"
    15  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    16  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    17  	"github.com/spf13/viper"
    18  
    19  	reflection "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server/grpc/reflection/v2alpha1"
    20  
    21  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    22  	"github.com/gogo/protobuf/jsonpb"
    23  
    24  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server/grpc/gogoreflection"
    25  
    26  	"google.golang.org/grpc"
    27  
    28  	"github.com/fibonacci-chain/fbc/libs/tendermint/config"
    29  )
    30  
    31  // ServerStartTime defines the time duration that the server need to stay running after startup
    32  // for the startup be considered successful
    33  const ServerStartTime = 5 * time.Second
    34  
    35  // StartGRPCServer starts a gRPC server on the given address.
    36  func StartGRPCServer(cdc *codec.CodecProxy, interfaceReg jsonpb.AnyResolver, app app2.ApplicationAdapter, cfg config.GRPCConfig, tmNode *node.Node) (*grpc.Server, error) {
    37  	txCfg := utils.NewPbTxConfig(interfaceReg.(interfacetypes.InterfaceRegistry))
    38  
    39  	cliCtx := context.NewCLIContext().WithProxy(cdc).WithInterfaceRegistry(interfaceReg.(interfacetypes.InterfaceRegistry)).WithTrustNode(true)
    40  	if tmNode != nil {
    41  		cliCtx = cliCtx.WithChainID(tmNode.ConsensusState().GetState().ChainID)
    42  	} else {
    43  		cliCtx = cliCtx.WithChainID(viper.GetString(flags.FlagChainID))
    44  	}
    45  
    46  	maxSendMsgSize := cfg.MaxSendMsgSize
    47  	if maxSendMsgSize == 0 {
    48  		maxSendMsgSize = config.DefaultGRPCMaxSendMsgSize
    49  	}
    50  
    51  	maxRecvMsgSize := cfg.MaxRecvMsgSize
    52  	if maxRecvMsgSize == 0 {
    53  		maxRecvMsgSize = config.DefaultGRPCMaxRecvMsgSize
    54  	}
    55  
    56  	grpcSrv := grpc.NewServer(
    57  		grpc.MaxSendMsgSize(maxSendMsgSize),
    58  		grpc.MaxRecvMsgSize(maxRecvMsgSize),
    59  	)
    60  
    61  	app.RegisterTxService(cliCtx)
    62  	app.RegisterGRPCServer(grpcSrv)
    63  
    64  	// Reflection allows consumers to build dynamic clients that can write to any
    65  	// Cosmos SDK application without relying on application packages at compile
    66  	// time.
    67  	err := reflection.Register(grpcSrv, reflection.Config{
    68  		SigningModes: func() map[string]int32 {
    69  			modes := make(map[string]int32, len(txCfg.SignModeHandler().Modes()))
    70  			for _, m := range txCfg.SignModeHandler().Modes() {
    71  				modes[m.String()] = (int32)(m)
    72  			}
    73  			return modes
    74  		}(),
    75  		ChainID:           cliCtx.ChainID,
    76  		SdkConfig:         sdk.GetConfig(),
    77  		InterfaceRegistry: cliCtx.InterfaceRegistry,
    78  	})
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	// Reflection allows external clients to see what services and methods
    84  	// the gRPC server exposes.
    85  	gogoreflection.Register(grpcSrv)
    86  
    87  	listener, err := net.Listen("tcp", cfg.Address)
    88  	if err != nil {
    89  		return nil, err
    90  	}
    91  
    92  	errCh := make(chan error)
    93  	go func() {
    94  		err = grpcSrv.Serve(listener)
    95  		if err != nil {
    96  			errCh <- fmt.Errorf("failed to serve: %w", err)
    97  		}
    98  	}()
    99  
   100  	select {
   101  	case err := <-errCh:
   102  		return nil, err
   103  
   104  	case <-time.After(ServerStartTime):
   105  		// assume server started successfully
   106  		return grpcSrv, nil
   107  	}
   108  }