Skip to content

Commit 215e5b9

Browse files
committed
loopd: extract daemon into struct
1 parent e696a38 commit 215e5b9

File tree

2 files changed

+47
-23
lines changed

2 files changed

+47
-23
lines changed

loopd/daemon.go

Lines changed: 45 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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.

loopd/start.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ func Start(rpcCfg RPCConfig) error {
168168

169169
// Execute command.
170170
if parser.Active == nil {
171-
return daemon(&config, lisCfg)
171+
daemon := New(&config, lisCfg)
172+
return daemon.Run()
172173
}
173174

174175
if parser.Active.Name == "view" {

0 commit comments

Comments
 (0)