@@ -38,34 +38,57 @@ type listenerCfg struct {
3838 getLnd func (string , * lndConfig ) (* lndclient.GrpcLndServices , error )
3939}
4040
41- // daemon runs loopd in daemon mode. It will listen for grpc connections,
41+ // Daemon is the struct that holds one instance of the loop client daemon.
42+ type Daemon struct {
43+ // swapClientServer is the embedded RPC server that satisfies the client
44+ // RPC interface. We embed this struct so the Daemon itself can be
45+ // registered to an existing grpc.Server to run as a subserver in the
46+ // same process.
47+ swapClientServer
48+
49+ cfg * Config
50+ listenerCfg * listenerCfg
51+
52+ lnd * lndclient.GrpcLndServices
53+ }
54+
55+ // New creates a new instance of the loop client daemon.
56+ func New (config * Config , lisCfg * listenerCfg ) * Daemon {
57+ return & Daemon {
58+ cfg : config ,
59+ listenerCfg : lisCfg ,
60+ }
61+ }
62+
63+ // Run runs loopd in daemon mode. It will listen for grpc connections,
4264// execute commands and pass back swap status information.
43- func daemon (config * Config , lisCfg * listenerCfg ) error {
44- lnd , err := lisCfg .getLnd (config .Network , config .Lnd )
65+ func (d * Daemon ) Run () error {
66+ var err error
67+ d .lnd , err = d .listenerCfg .getLnd (d .cfg .Network , d .cfg .Lnd )
4568 if err != nil {
4669 return err
4770 }
48- defer lnd .Close ()
71+ defer d . lnd .Close ()
4972
5073 // If no swap server is specified, use the default addresses for mainnet
5174 // and testnet.
52- if config .SwapServer == "" {
75+ if d . cfg .SwapServer == "" {
5376 // TODO(wilmer): Use onion service addresses when proxy is
5477 // active.
55- switch config .Network {
78+ switch d . cfg .Network {
5679 case "mainnet" :
57- config .SwapServer = mainnetServer
80+ d . cfg .SwapServer = mainnetServer
5881 case "testnet" :
59- config .SwapServer = testnetServer
82+ d . cfg .SwapServer = testnetServer
6083 default :
6184 return errors .New ("no swap server address specified" )
6285 }
6386 }
6487
65- log .Infof ("Swap server address: %v" , config .SwapServer )
88+ log .Infof ("Swap server address: %v" , d . cfg .SwapServer )
6689
6790 // Create an instance of the loop client library.
68- swapClient , cleanup , err := getClient (config , & lnd .LndServices )
91+ swapClient , cleanup , err := getClient (d . cfg , & d . lnd .LndServices )
6992 if err != nil {
7093 return err
7194 }
@@ -83,24 +106,24 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
83106 }
84107
85108 // Instantiate the loopd gRPC server.
86- server : = swapClientServer {
109+ d . swapClientServer = swapClientServer {
87110 impl : swapClient ,
88- lnd : & lnd .LndServices ,
111+ lnd : & d . lnd .LndServices ,
89112 swaps : swaps ,
90113 subscribers : make (map [int ]chan <- interface {}),
91114 statusChan : make (chan loop.SwapInfo ),
92115 }
93116
94117 serverOpts := []grpc.ServerOption {}
95118 grpcServer := grpc .NewServer (serverOpts ... )
96- looprpc .RegisterSwapClientServer (grpcServer , & server )
119+ looprpc .RegisterSwapClientServer (grpcServer , d )
97120
98121 // Next, start the gRPC server listening for HTTP/2 connections.
99122 log .Infof ("Starting gRPC listener" )
100- grpcListener , err := lisCfg .grpcListener ()
123+ grpcListener , err := d . listenerCfg .grpcListener ()
101124 if err != nil {
102125 return fmt .Errorf ("RPC server unable to listen on %s" ,
103- config .RPCListen )
126+ d . cfg .RPCListen )
104127
105128 }
106129 defer grpcListener .Close ()
@@ -122,24 +145,24 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
122145 defer cancel ()
123146 mux := proxy .NewServeMux (customMarshalerOption )
124147 var restHandler http.Handler = mux
125- if config .CORSOrigin != "" {
126- restHandler = allowCORS (restHandler , config .CORSOrigin )
148+ if d . cfg .CORSOrigin != "" {
149+ restHandler = allowCORS (restHandler , d . cfg .CORSOrigin )
127150 }
128151 proxyOpts := []grpc.DialOption {
129152 grpc .WithInsecure (),
130153 grpc .WithDefaultCallOptions (maxMsgRecvSize ),
131154 }
132155 err = looprpc .RegisterSwapClientHandlerFromEndpoint (
133- ctx , mux , config .RPCListen , proxyOpts ,
156+ ctx , mux , d . cfg .RPCListen , proxyOpts ,
134157 )
135158 if err != nil {
136159 return err
137160 }
138161
139- restListener , err := lisCfg .restListener ()
162+ restListener , err := d . listenerCfg .restListener ()
140163 if err != nil {
141164 return fmt .Errorf ("REST proxy unable to listen on %s" ,
142- config .RESTListen )
165+ d . cfg .RESTListen )
143166 }
144167
145168 // A nil listener indicates REST is disabled.
@@ -170,7 +193,7 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
170193 defer wg .Done ()
171194
172195 log .Infof ("Starting swap client" )
173- err := swapClient .Run (mainCtx , server .statusChan )
196+ err := swapClient .Run (mainCtx , d .statusChan )
174197 if err != nil {
175198 log .Error (err )
176199 }
@@ -188,7 +211,7 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
188211 defer wg .Done ()
189212
190213 log .Infof ("Waiting for updates" )
191- server .processStatusUpdates (mainCtx )
214+ d .processStatusUpdates (mainCtx )
192215 }()
193216
194217 // Start the grpc server.
0 commit comments