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 }