github.com/Finschia/finschia-sdk@v0.48.1/server/grpc/server.go (about) 1 package grpc 2 3 import ( 4 "fmt" 5 "net" 6 "time" 7 8 "google.golang.org/grpc" 9 10 "github.com/Finschia/finschia-sdk/client" 11 "github.com/Finschia/finschia-sdk/server/config" 12 "github.com/Finschia/finschia-sdk/server/grpc/gogoreflection" 13 reflection "github.com/Finschia/finschia-sdk/server/grpc/reflection/v2" 14 "github.com/Finschia/finschia-sdk/server/types" 15 sdk "github.com/Finschia/finschia-sdk/types" 16 ) 17 18 // StartGRPCServer starts a gRPC server on the given address. 19 func StartGRPCServer(clientCtx client.Context, app types.Application, cfg config.GRPCConfig) (*grpc.Server, error) { 20 maxSendMsgSize := cfg.MaxSendMsgSize 21 if maxSendMsgSize == 0 { 22 maxSendMsgSize = config.DefaultGRPCMaxSendMsgSize 23 } 24 25 maxRecvMsgSize := cfg.MaxRecvMsgSize 26 if maxRecvMsgSize == 0 { 27 maxRecvMsgSize = config.DefaultGRPCMaxRecvMsgSize 28 } 29 30 grpcSrv := grpc.NewServer( 31 grpc.MaxSendMsgSize(maxSendMsgSize), 32 grpc.MaxRecvMsgSize(maxRecvMsgSize), 33 ) 34 app.RegisterGRPCServer(grpcSrv) 35 36 // Reflection allows consumers to build dynamic clients that can write to any 37 // Cosmos SDK application without relying on application packages at compile 38 // time. 39 err := reflection.Register(grpcSrv, reflection.Config{ 40 SigningModes: func() map[string]int32 { 41 modes := make(map[string]int32, len(clientCtx.TxConfig.SignModeHandler().Modes())) 42 for _, m := range clientCtx.TxConfig.SignModeHandler().Modes() { 43 modes[m.String()] = (int32)(m) 44 } 45 return modes 46 }(), 47 ChainID: clientCtx.ChainID, 48 SdkConfig: sdk.GetConfig(), 49 InterfaceRegistry: clientCtx.InterfaceRegistry, 50 }) 51 if err != nil { 52 return nil, err 53 } 54 // Reflection allows external clients to see what services and methods 55 // the gRPC server exposes. 56 gogoreflection.Register(grpcSrv) 57 58 listener, err := net.Listen("tcp", cfg.Address) 59 if err != nil { 60 return nil, err 61 } 62 63 errCh := make(chan error) 64 go func() { 65 err = grpcSrv.Serve(listener) 66 if err != nil { 67 errCh <- fmt.Errorf("failed to serve: %w", err) 68 } 69 }() 70 71 select { 72 case err := <-errCh: 73 return nil, err 74 case <-time.After(types.ServerStartTime): 75 // assume server started successfully 76 return grpcSrv, nil 77 } 78 }