From eb8277b9f9320b7506aa93e72efd661feb72d1c6 Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Tue, 12 Mar 2019 15:35:53 -0700 Subject: [PATCH] cmd/loopd: add REST proxy --- cmd/loopd/config.go | 6 ++++-- cmd/loopd/daemon.go | 40 +++++++++++++++++++++++++++++++++------- go.mod | 1 + 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/cmd/loopd/config.go b/cmd/loopd/config.go index 04e4315..e37dcd9 100644 --- a/cmd/loopd/config.go +++ b/cmd/loopd/config.go @@ -12,7 +12,8 @@ type config struct { Insecure bool `long:"insecure" description:"disable tls"` Network string `long:"network" description:"network to run on" choice:"regtest" choice:"testnet" choice:"mainnet" choice:"simnet"` SwapServer string `long:"swapserver" description:"swap server address host:port"` - Listen string `long:"listen" description:"address to listen on for rpc lcients"` + RPCListen string `long:"rpclisten" description:"Address to listen on for gRPC clients"` + RESTListen string `long:"restlisten" description:"Address to listen on for REST clients"` Lnd *lndConfig `group:"lnd" namespace:"lnd"` @@ -22,7 +23,8 @@ type config struct { var defaultConfig = config{ Network: "mainnet", SwapServer: "swap.lightning.today:11009", - Listen: "localhost:11010", + RPCListen: "localhost:11010", + RESTListen: "localhost:8081", Insecure: false, Lnd: &lndConfig{ Host: "localhost:10009", diff --git a/cmd/loopd/daemon.go b/cmd/loopd/daemon.go index 9018763..dd5875d 100644 --- a/cmd/loopd/daemon.go +++ b/cmd/loopd/daemon.go @@ -4,12 +4,14 @@ import ( "context" "fmt" "net" + "net/http" "os" "os/signal" "runtime/pprof" "sync" "time" + proxy "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightninglabs/loop" "github.com/lightninglabs/loop/looprpc" "google.golang.org/grpc" @@ -59,15 +61,38 @@ func daemon(config *config) error { grpcServer := grpc.NewServer(serverOpts...) looprpc.RegisterSwapClientServer(grpcServer, &server) - // Next, Start the gRPC server listening for HTTP/2 connections. - logger.Infof("Starting RPC listener") - lis, err := net.Listen("tcp", config.Listen) + // Next, start the gRPC server listening for HTTP/2 connections. + logger.Infof("Starting gRPC listener") + grpcListener, err := net.Listen("tcp", config.RPCListen) if err != nil { return fmt.Errorf("RPC server unable to listen on %s", - config.Listen) + config.RPCListen) } - defer lis.Close() + defer grpcListener.Close() + + // We'll also create and start an accompanying proxy to serve clients + // through REST. + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + mux := proxy.NewServeMux() + proxyOpts := []grpc.DialOption{grpc.WithInsecure()} + err = looprpc.RegisterSwapClientHandlerFromEndpoint( + ctx, mux, config.RPCListen, proxyOpts, + ) + if err != nil { + return err + } + + logger.Infof("Starting REST proxy listener") + restListener, err := net.Listen("tcp", config.RESTListen) + if err != nil { + return fmt.Errorf("REST proxy unable to listen on %s", + config.RESTListen) + } + defer restListener.Close() + proxy := &http.Server{Handler: mux} + go proxy.Serve(restListener) statusChan := make(chan loop.SwapInfo) @@ -124,9 +149,10 @@ func daemon(config *config) error { go func() { defer wg.Done() - logger.Infof("RPC server listening on %s", lis.Addr()) + logger.Infof("RPC server listening on %s", grpcListener.Addr()) + logger.Infof("REST proxy listening on %s", restListener.Addr()) - err = grpcServer.Serve(lis) + err = grpcServer.Serve(grpcListener) if err != nil { logger.Error(err) } diff --git a/go.mod b/go.mod index d1d3823..535d759 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/coreos/bbolt v0.0.0-20180223184059-7ee3ded59d4835e10f3e7d0f7603c42aa5e83820 github.com/fortytw2/leaktest v1.3.0 github.com/golang/protobuf v1.2.0 + github.com/grpc-ecosystem/grpc-gateway v0.0.0-20170724004829-f2862b476edc github.com/jessevdk/go-flags v0.0.0-20170926144705-f88afde2fa19 github.com/lightningnetwork/lnd v0.0.0 github.com/urfave/cli v1.20.0