Skip to content

Commit 8baec2c

Browse files
committed
multi: extract sessionRPCserver stuff into its own struct
Let sessionRpcServer handle the session db and session server instead of LightningTerminal handling those direclty. Then start the sessionRpcServer as if it was a subserver like loop/pool.
1 parent 282dae5 commit 8baec2c

File tree

2 files changed

+88
-54
lines changed

2 files changed

+88
-54
lines changed

session_rpcserver.go

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/lightninglabs/lightning-node-connect/mailbox"
1212
"github.com/lightninglabs/lightning-terminal/litrpc"
1313
"github.com/lightninglabs/lightning-terminal/session"
14+
"google.golang.org/grpc"
1415
)
1516

1617
// sessionRpcServer is the gRPC server for the Session RPC interface.
@@ -19,6 +20,7 @@ type sessionRpcServer struct {
1920

2021
basicAuth string
2122

23+
cfg *sessionRpcServerConfig
2224
db *session.DB
2325
sessionServer *session.Server
2426

@@ -27,12 +29,75 @@ type sessionRpcServer struct {
2729
stopOnce sync.Once
2830
}
2931

32+
// sessionRpcServerConfig holds the values used to configure the
33+
// sessionRpcServer.
34+
type sessionRpcServerConfig struct {
35+
basicAuth string
36+
dbDir string
37+
grpcOptions []grpc.ServerOption
38+
}
39+
40+
// newSessionRPCServer creates a new sessionRpcServer using the passed config.
41+
func newSessionRPCServer(cfg *sessionRpcServerConfig) (*sessionRpcServer,
42+
error) {
43+
44+
// Create an instance of the local Terminal Connect session store DB.
45+
db, err := session.NewDB(cfg.dbDir, session.DBFilename)
46+
if err != nil {
47+
return nil, fmt.Errorf("error creating session DB: %v", err)
48+
}
49+
50+
// Create the gRPC server that handles adding/removing sessions and the
51+
// actual mailbox server that spins up the Terminal Connect server
52+
// interface.
53+
server := session.NewServer(
54+
func(opts ...grpc.ServerOption) *grpc.Server {
55+
allOpts := append(cfg.grpcOptions, opts...)
56+
return grpc.NewServer(allOpts...)
57+
},
58+
)
59+
60+
return &sessionRpcServer{
61+
cfg: cfg,
62+
basicAuth: cfg.basicAuth,
63+
db: db,
64+
sessionServer: server,
65+
}, nil
66+
}
67+
68+
// start all the components necessary for the sessionRpcServer to start serving
69+
// requests. This includes starting the macaroon service and resuming all
70+
// non-revoked sessions.
71+
func (s *sessionRpcServer) start() error {
72+
// Start up all previously created sessions.
73+
sessions, err := s.db.ListSessions()
74+
if err != nil {
75+
return fmt.Errorf("error listing sessions: %v", err)
76+
}
77+
for _, sess := range sessions {
78+
if err := s.resumeSession(sess); err != nil {
79+
return fmt.Errorf("error resuming sesion: %v", err)
80+
}
81+
}
82+
83+
return nil
84+
}
85+
3086
// stop cleans up any sessionRpcServer resources.
31-
func (s *sessionRpcServer) stop() {
87+
func (s *sessionRpcServer) stop() error {
88+
var returnErr error
3289
s.stopOnce.Do(func() {
90+
if err := s.db.Close(); err != nil {
91+
log.Errorf("Error closing session DB: %v", err)
92+
returnErr = err
93+
}
94+
s.sessionServer.Stop()
95+
3396
close(s.quit)
3497
s.wg.Wait()
3598
})
99+
100+
return returnErr
36101
}
37102

38103
// AddSession adds and starts a new Terminal Connect session.

terminal.go

Lines changed: 22 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"github.com/jessevdk/go-flags"
2323
"github.com/lightninglabs/faraday/frdrpc"
2424
"github.com/lightninglabs/lightning-terminal/litrpc"
25-
"github.com/lightninglabs/lightning-terminal/session"
2625
"github.com/lightninglabs/lndclient"
2726
"github.com/lightninglabs/loop"
2827
"github.com/lightninglabs/loop/loopd"
@@ -154,9 +153,8 @@ type LightningTerminal struct {
154153
rpcProxy *rpcProxy
155154
httpServer *http.Server
156155

157-
sessionDB *session.DB
158-
sessionServer *session.Server
159-
sessionRpcServer *sessionRpcServer
156+
sessionRpcServer *sessionRpcServer
157+
sessionRpcServerStarted bool
160158

161159
restHandler http.Handler
162160
restCancel func()
@@ -194,52 +192,18 @@ func (g *LightningTerminal) Run() error {
194192
g.rpcProxy = newRpcProxy(
195193
g.cfg, g, getAllMethodPermissions(), bufRpcListener,
196194
)
197-
198-
// Create an instance of the local Terminal Connect session store DB.
199-
networkDir := path.Join(g.cfg.LitDir, g.cfg.Network)
200-
g.sessionDB, err = session.NewDB(networkDir, session.DBFilename)
201-
if err != nil {
202-
return fmt.Errorf("error creating session DB: %v", err)
203-
}
204-
205-
// Create the gRPC server that handles adding/removing sessions and the
206-
// actual mailbox server that spins up the Terminal Connect server
207-
// interface.
208-
g.sessionServer = session.NewServer(
209-
func(opts ...grpc.ServerOption) *grpc.Server {
210-
allOpts := []grpc.ServerOption{
211-
grpc.CustomCodec(grpcProxy.Codec()), // nolint: staticcheck,
212-
grpc.UnknownServiceHandler(
213-
grpcProxy.TransparentHandler(
214-
g.rpcProxy.director,
215-
),
195+
g.sessionRpcServer, err = newSessionRPCServer(&sessionRpcServerConfig{
196+
basicAuth: g.rpcProxy.basicAuth,
197+
dbDir: path.Join(g.cfg.LitDir, g.cfg.Network),
198+
grpcOptions: []grpc.ServerOption{
199+
grpc.CustomCodec(grpcProxy.Codec()), // nolint: staticcheck,
200+
grpc.UnknownServiceHandler(
201+
grpcProxy.TransparentHandler(
202+
g.rpcProxy.director,
216203
),
217-
}
218-
allOpts = append(allOpts, opts...)
219-
mailboxGrpcServer := grpc.NewServer(allOpts...)
220-
221-
_ = g.RegisterGrpcSubserver(mailboxGrpcServer)
222-
223-
return mailboxGrpcServer
204+
),
224205
},
225-
)
226-
g.sessionRpcServer = &sessionRpcServer{
227-
basicAuth: g.rpcProxy.basicAuth,
228-
db: g.sessionDB,
229-
sessionServer: g.sessionServer,
230-
quit: make(chan struct{}),
231-
}
232-
233-
// Now start up all previously created sessions.
234-
sessions, err := g.sessionDB.ListSessions()
235-
if err != nil {
236-
return fmt.Errorf("error listing sessions: %v", err)
237-
}
238-
for _, sess := range sessions {
239-
if err := g.sessionRpcServer.resumeSession(sess); err != nil {
240-
return fmt.Errorf("error resuming sesion: %v", err)
241-
}
242-
}
206+
})
243207

244208
// Overwrite the loop and pool daemon's user agent name so it sends
245209
// "litd" instead of "loopd" and "poold" respectively.
@@ -565,6 +529,11 @@ func (g *LightningTerminal) startSubservers() error {
565529
g.poolStarted = true
566530
}
567531

532+
if err = g.sessionRpcServer.start(); err != nil {
533+
return err
534+
}
535+
g.sessionRpcServerStarted = true
536+
568537
return nil
569538
}
570539

@@ -839,12 +808,12 @@ func (g *LightningTerminal) shutdown() error {
839808
}
840809
}
841810

842-
g.sessionRpcServer.stop()
843-
if err := g.sessionDB.Close(); err != nil {
844-
log.Errorf("Error closing session DB: %v", err)
845-
returnErr = err
811+
if g.sessionRpcServerStarted {
812+
if err := g.sessionRpcServer.stop(); err != nil {
813+
log.Errorf("Error closing session DB: %v", err)
814+
returnErr = err
815+
}
846816
}
847-
g.sessionServer.Stop()
848817

849818
if g.lndClient != nil {
850819
g.lndClient.Close()

0 commit comments

Comments
 (0)