@@ -38,34 +38,57 @@ type listenerCfg struct {
38
38
getLnd func (string , * lndConfig ) (* lndclient.GrpcLndServices , error )
39
39
}
40
40
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,
42
64
// 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 )
45
68
if err != nil {
46
69
return err
47
70
}
48
- defer lnd .Close ()
71
+ defer d . lnd .Close ()
49
72
50
73
// If no swap server is specified, use the default addresses for mainnet
51
74
// and testnet.
52
- if config .SwapServer == "" {
75
+ if d . cfg .SwapServer == "" {
53
76
// TODO(wilmer): Use onion service addresses when proxy is
54
77
// active.
55
- switch config .Network {
78
+ switch d . cfg .Network {
56
79
case "mainnet" :
57
- config .SwapServer = mainnetServer
80
+ d . cfg .SwapServer = mainnetServer
58
81
case "testnet" :
59
- config .SwapServer = testnetServer
82
+ d . cfg .SwapServer = testnetServer
60
83
default :
61
84
return errors .New ("no swap server address specified" )
62
85
}
63
86
}
64
87
65
- log .Infof ("Swap server address: %v" , config .SwapServer )
88
+ log .Infof ("Swap server address: %v" , d . cfg .SwapServer )
66
89
67
90
// 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 )
69
92
if err != nil {
70
93
return err
71
94
}
@@ -83,24 +106,24 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
83
106
}
84
107
85
108
// Instantiate the loopd gRPC server.
86
- server : = swapClientServer {
109
+ d . swapClientServer = swapClientServer {
87
110
impl : swapClient ,
88
- lnd : & lnd .LndServices ,
111
+ lnd : & d . lnd .LndServices ,
89
112
swaps : swaps ,
90
113
subscribers : make (map [int ]chan <- interface {}),
91
114
statusChan : make (chan loop.SwapInfo ),
92
115
}
93
116
94
117
serverOpts := []grpc.ServerOption {}
95
118
grpcServer := grpc .NewServer (serverOpts ... )
96
- looprpc .RegisterSwapClientServer (grpcServer , & server )
119
+ looprpc .RegisterSwapClientServer (grpcServer , d )
97
120
98
121
// Next, start the gRPC server listening for HTTP/2 connections.
99
122
log .Infof ("Starting gRPC listener" )
100
- grpcListener , err := lisCfg .grpcListener ()
123
+ grpcListener , err := d . listenerCfg .grpcListener ()
101
124
if err != nil {
102
125
return fmt .Errorf ("RPC server unable to listen on %s" ,
103
- config .RPCListen )
126
+ d . cfg .RPCListen )
104
127
105
128
}
106
129
defer grpcListener .Close ()
@@ -122,24 +145,24 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
122
145
defer cancel ()
123
146
mux := proxy .NewServeMux (customMarshalerOption )
124
147
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 )
127
150
}
128
151
proxyOpts := []grpc.DialOption {
129
152
grpc .WithInsecure (),
130
153
grpc .WithDefaultCallOptions (maxMsgRecvSize ),
131
154
}
132
155
err = looprpc .RegisterSwapClientHandlerFromEndpoint (
133
- ctx , mux , config .RPCListen , proxyOpts ,
156
+ ctx , mux , d . cfg .RPCListen , proxyOpts ,
134
157
)
135
158
if err != nil {
136
159
return err
137
160
}
138
161
139
- restListener , err := lisCfg .restListener ()
162
+ restListener , err := d . listenerCfg .restListener ()
140
163
if err != nil {
141
164
return fmt .Errorf ("REST proxy unable to listen on %s" ,
142
- config .RESTListen )
165
+ d . cfg .RESTListen )
143
166
}
144
167
145
168
// A nil listener indicates REST is disabled.
@@ -170,7 +193,7 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
170
193
defer wg .Done ()
171
194
172
195
log .Infof ("Starting swap client" )
173
- err := swapClient .Run (mainCtx , server .statusChan )
196
+ err := swapClient .Run (mainCtx , d .statusChan )
174
197
if err != nil {
175
198
log .Error (err )
176
199
}
@@ -188,7 +211,7 @@ func daemon(config *Config, lisCfg *listenerCfg) error {
188
211
defer wg .Done ()
189
212
190
213
log .Infof ("Waiting for updates" )
191
- server .processStatusUpdates (mainCtx )
214
+ d .processStatusUpdates (mainCtx )
192
215
}()
193
216
194
217
// Start the grpc server.
0 commit comments