github.com/Finschia/finschia-sdk@v0.48.1/server/grpc/grpc_web.go (about)

     1  package grpc
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"time"
     7  
     8  	"github.com/improbable-eng/grpc-web/go/grpcweb"
     9  	"google.golang.org/grpc"
    10  
    11  	"github.com/Finschia/finschia-sdk/server/config"
    12  	"github.com/Finschia/finschia-sdk/server/types"
    13  )
    14  
    15  // StartGRPCWeb starts a gRPC-Web server on the given address.
    16  func StartGRPCWeb(grpcSrv *grpc.Server, config config.Config) (*http.Server, error) {
    17  	var options []grpcweb.Option
    18  	if config.GRPCWeb.EnableUnsafeCORS {
    19  		options = append(options,
    20  			grpcweb.WithOriginFunc(func(origin string) bool {
    21  				return true
    22  			}),
    23  		)
    24  	}
    25  
    26  	wrappedServer := grpcweb.WrapServer(grpcSrv, options...)
    27  	grpcWebSrv := &http.Server{
    28  		Addr:              config.GRPCWeb.Address,
    29  		Handler:           wrappedServer,
    30  		ReadHeaderTimeout: 500 * time.Millisecond,
    31  	}
    32  
    33  	errCh := make(chan error)
    34  	go func() {
    35  		if err := grpcWebSrv.ListenAndServe(); err != nil {
    36  			errCh <- fmt.Errorf("[grpc] failed to serve: %w", err)
    37  		}
    38  	}()
    39  
    40  	select {
    41  	case err := <-errCh:
    42  		return nil, err
    43  	case <-time.After(types.ServerStartTime): // assume server started successfully
    44  		return grpcWebSrv, nil
    45  	}
    46  }