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  }