diff --git a/client/lcd/root.go b/client/lcd/root.go index ae4dc5642..542e67d57 100644 --- a/client/lcd/root.go +++ b/client/lcd/root.go @@ -34,11 +34,84 @@ func ServeCommand(cdc *wire.Codec) *cobra.Command { flagMaxOpenConnections := "max-open" cmd := &cobra.Command{ - Use: "lite-server", - Short: "Start Gaia-lite server daemon, a local REST server", + Use: "rest-server", + Short: "Start LCD (light-client daemon), a local REST server", RunE: func(cmd *cobra.Command, args []string) error { listenAddr := viper.GetString(flagListenAddr) - router := createHandler(cdc) + handler := createHandler(cdc) + logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "rest-server") + maxOpen := viper.GetInt(flagMaxOpenConnections) + + listener, err := tmserver.StartHTTPServer( + listenAddr, handler, logger, + tmserver.Config{MaxOpenConnections: maxOpen}, + ) + if err != nil { + return err + } + + logger.Info("REST server started") + + // wait forever and cleanup + cmn.TrapSignal(func() { + err := listener.Close() + logger.Error("error closing listener", "err", err) + }) + + return nil + }, + } + + cmd.Flags().String(flagListenAddr, "tcp://localhost:1317", "The address for the server to listen on") + cmd.Flags().String(flagCORS, "", "Set the domains that can make CORS requests (* for all)") + cmd.Flags().String(client.FlagChainID, "", "The chain ID to connect to") + cmd.Flags().String(client.FlagNode, "tcp://localhost:26657", "Address of the node to connect to") + cmd.Flags().Int(flagMaxOpenConnections, 1000, "The number of maximum open connections") + cmd.Flags().Bool(client.FlagTrustNode, false, "Whether trust connected full node") + + return cmd +} + + +func createHandler(cdc *wire.Codec) *mux.Router { + r := mux.NewRouter() + + kb, err := keys.GetKeyBase() //XXX + if err != nil { + panic(err) + } + + cliCtx := context.NewCLIContext().WithCodec(cdc).WithLogger(os.Stdout) + + // TODO: make more functional? aka r = keys.RegisterRoutes(r) + r.HandleFunc("/version", CLIVersionRequestHandler).Methods("GET") + r.HandleFunc("/node_version", NodeVersionRequestHandler(cliCtx)).Methods("GET") + + keys.RegisterRoutes(r) + rpc.RegisterRoutes(cliCtx, r) + tx.RegisterRoutes(cliCtx, r, cdc) + auth.RegisterRoutes(cliCtx, r, cdc, "acc") + bank.RegisterRoutes(cliCtx, r, cdc, kb) + ibc.RegisterRoutes(cliCtx, r, cdc, kb) + stake.RegisterRoutes(cliCtx, r, cdc, kb) + slashing.RegisterRoutes(cliCtx, r, cdc, kb) + gov.RegisterRoutes(cliCtx, r, cdc) + + return r +} + +// ServeLiteCommand will generate a long-running rest server for gaia-lite +func ServeLiteCommand(cdc *wire.Codec) *cobra.Command { + flagListenAddr := "laddr" + flagCORS := "cors" + flagMaxOpenConnections := "max-open" + + cmd := &cobra.Command{ + Use: "lite-server", + Short: "Start Gaia-lite server daemon, a local REST server with swagger-ui, default url: http//localhost:1317/swaggerui/", + RunE: func(cmd *cobra.Command, args []string) error { + listenAddr := viper.GetString(flagListenAddr) + router := createLiteHandler(cdc) statikFS, err := fs.New() if err != nil { @@ -80,7 +153,7 @@ func ServeCommand(cdc *wire.Codec) *cobra.Command { return cmd } -func createHandler(cdc *wire.Codec) *mux.Router { +func createLiteHandler(cdc *wire.Codec) *mux.Router { r := mux.NewRouter() kb, err := keys.GetKeyBase() //XXX @@ -90,19 +163,11 @@ func createHandler(cdc *wire.Codec) *mux.Router { cliCtx := context.NewCLIContext().WithCodec(cdc).WithLogger(os.Stdout) - // TODO: make more functional? aka r = keys.RegisterRoutes(r) r.HandleFunc("/version", CLIVersionRequestHandler).Methods("GET") r.HandleFunc("/node_version", NodeVersionRequestHandler(cliCtx)).Methods("GET") - keys.RegisterRoutes(r) - rpc.RegisterRoutes(cliCtx, r) - tx.RegisterRoutes(cliCtx, r, cdc) - auth.RegisterRoutes(cliCtx, r, cdc, "acc") - bank.RegisterRoutes(cliCtx, r, cdc, kb) - ibc.RegisterRoutes(cliCtx, r, cdc, kb) - stake.RegisterRoutes(cliCtx, r, cdc, kb) - slashing.RegisterRoutes(cliCtx, r, cdc, kb) - gov.RegisterRoutes(cliCtx, r, cdc) + tx.RegisterLiteRoutes(cliCtx, r, cdc) + bank.RegisterLiteRoutes(cliCtx, r, cdc, kb) return r -} +} \ No newline at end of file diff --git a/client/tx/root.go b/client/tx/root.go index fd0209e16..915524ce9 100644 --- a/client/tx/root.go +++ b/client/tx/root.go @@ -21,5 +21,10 @@ func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *wire.Codec) { r.HandleFunc("/txs/{hash}", QueryTxRequestHandlerFn(cdc, cliCtx)).Methods("GET") r.HandleFunc("/txs", SearchTxRequestHandlerFn(cliCtx, cdc)).Methods("GET") // r.HandleFunc("/txs/sign", SignTxRequstHandler).Methods("POST") + // r.HandleFunc("/txs/broadcast", BroadcastTxRequestHandler).Methods("POST") +} + +// RegisterLiteRoutes registers REST routes to gaia-lite +func RegisterLiteRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *wire.Codec) { r.HandleFunc("/txs", BroadcastTxRequestHandlerFn(cdc, cliCtx)).Methods("POST") } diff --git a/cmd/gaia/cmd/gaiacli/main.go b/cmd/gaia/cmd/gaiacli/main.go index ed9bd0483..7975c1c96 100644 --- a/cmd/gaia/cmd/gaiacli/main.go +++ b/cmd/gaia/cmd/gaiacli/main.go @@ -67,6 +67,7 @@ func main() { tendermintCmd, ibcCmd, lcd.ServeCommand(cdc), + lcd.ServeLiteCommand(cdc), client.LineBreak, ) diff --git a/examples/basecoin/cmd/basecli/main.go b/examples/basecoin/cmd/basecli/main.go index cbfae5fe0..0cd2581cc 100644 --- a/examples/basecoin/cmd/basecli/main.go +++ b/examples/basecoin/cmd/basecli/main.go @@ -80,6 +80,7 @@ func main() { rootCmd.AddCommand( client.LineBreak, lcd.ServeCommand(cdc), + lcd.ServeLiteCommand(cdc), keys.Commands(), client.LineBreak, version.VersionCmd, diff --git a/x/bank/client/rest/rest.go b/x/bank/client/rest/rest.go index 81e7078ab..f07db7ea3 100644 --- a/x/bank/client/rest/rest.go +++ b/x/bank/client/rest/rest.go @@ -9,6 +9,11 @@ import ( // RegisterRoutes registers bank-related REST handlers to a router func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { + registerSendTxRoutes(cliCtx, r, cdc, kb) +} + +// RegisterLiteRoutes registers bank REST handlers to gaia-lite +func RegisterLiteRoutes(cliCtx context.CLIContext, r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { registerQueryRoutes(cliCtx, r, cdc, "acc") registerSendTxRoutes(cliCtx, r, cdc, kb) }