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 }