Skip to content

Commit 1aee594

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 bcf8006 commit 1aee594

File tree

2 files changed

+110
-68
lines changed

2 files changed

+110
-68
lines changed

session_rpcserver.go

Lines changed: 75 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,98 @@ 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.
1718
type sessionRpcServer struct {
1819
litrpc.UnimplementedSessionsServer
1920

20-
basicAuth string
21-
21+
cfg *sessionRpcServerConfig
2222
db *session.DB
2323
sessionServer *session.Server
2424

25-
superMacBaker func(ctx context.Context, rootKeyID uint64,
26-
recipe *session.MacaroonRecipe) (string, error)
27-
2825
quit chan struct{}
2926
wg sync.WaitGroup
3027
stopOnce sync.Once
3128
}
3229

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

41108
// AddSession adds and starts a new Terminal Connect session.
@@ -117,12 +184,12 @@ func (s *sessionRpcServer) resumeSession(sess *session.Session) error {
117184
var authData []byte
118185
switch sess.Type {
119186
case session.TypeUIPassword:
120-
authData = []byte("Authorization: Basic " + s.basicAuth)
187+
authData = []byte("Authorization: Basic " + s.cfg.basicAuth)
121188

122189
case session.TypeMacaroonAdmin, session.TypeMacaroonReadonly:
123190
ctx := context.Background()
124191
readOnly := sess.Type == session.TypeMacaroonReadonly
125-
mac, err := s.superMacBaker(
192+
mac, err := s.cfg.superMacBaker(
126193
ctx, sess.MacaroonRootKey, &session.MacaroonRecipe{
127194
Permissions: GetAllPermissions(readOnly),
128195
},

terminal.go

Lines changed: 35 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -156,9 +156,8 @@ type LightningTerminal struct {
156156
rpcProxy *rpcProxy
157157
httpServer *http.Server
158158

159-
sessionDB *session.DB
160-
sessionServer *session.Server
161-
sessionRpcServer *sessionRpcServer
159+
sessionRpcServer *sessionRpcServer
160+
sessionRpcServerStarted bool
162161

163162
restHandler http.Handler
164163
restCancel func()
@@ -200,46 +199,27 @@ func (g *LightningTerminal) Run() error {
200199
g.cfg, g, g.validateSuperMacaroon, getAllMethodPermissions(),
201200
bufRpcListener,
202201
)
203-
204-
// Create an instance of the local Terminal Connect session store DB.
205-
networkDir := path.Join(g.cfg.LitDir, g.cfg.Network)
206-
g.sessionDB, err = session.NewDB(networkDir, session.DBFilename)
207-
if err != nil {
208-
return fmt.Errorf("error creating session DB: %v", err)
209-
}
210-
211-
// Create the gRPC server that handles adding/removing sessions and the
212-
// actual mailbox server that spins up the Terminal Connect server
213-
// interface.
214-
g.sessionServer = session.NewServer(
215-
func(opts ...grpc.ServerOption) *grpc.Server {
216-
allOpts := []grpc.ServerOption{
217-
grpc.CustomCodec(grpcProxy.Codec()), // nolint: staticcheck,
218-
grpc.ChainStreamInterceptor(
219-
g.rpcProxy.StreamServerInterceptor,
220-
),
221-
grpc.ChainUnaryInterceptor(
222-
g.rpcProxy.UnaryServerInterceptor,
223-
),
224-
grpc.UnknownServiceHandler(
225-
grpcProxy.TransparentHandler(
226-
// Don't allow calls to litrpc.
227-
g.rpcProxy.makeDirector(false),
228-
),
202+
g.sessionRpcServer, err = newSessionRPCServer(&sessionRpcServerConfig{
203+
basicAuth: g.rpcProxy.basicAuth,
204+
dbDir: path.Join(g.cfg.LitDir, g.cfg.Network),
205+
grpcOptions: []grpc.ServerOption{
206+
grpc.CustomCodec(grpcProxy.Codec()), // nolint: staticcheck,
207+
grpc.ChainStreamInterceptor(
208+
g.rpcProxy.StreamServerInterceptor,
209+
),
210+
grpc.ChainUnaryInterceptor(
211+
g.rpcProxy.UnaryServerInterceptor,
212+
),
213+
grpc.UnknownServiceHandler(
214+
grpcProxy.TransparentHandler(
215+
// Don't allow calls to litrpc.
216+
g.rpcProxy.makeDirector(false),
229217
),
230-
}
231-
allOpts = append(allOpts, opts...)
232-
grpcServer := grpc.NewServer(allOpts...)
233-
g.registerSubDaemonGrpcServers(grpcServer, false)
234-
235-
return grpcServer
218+
),
219+
},
220+
registerGrpcServers: func(server *grpc.Server) {
221+
g.registerSubDaemonGrpcServers(server, false)
236222
},
237-
)
238-
g.sessionRpcServer = &sessionRpcServer{
239-
basicAuth: g.rpcProxy.basicAuth,
240-
db: g.sessionDB,
241-
sessionServer: g.sessionServer,
242-
quit: make(chan struct{}),
243223
superMacBaker: func(ctx context.Context, rootKeyID uint64,
244224
recipe *session.MacaroonRecipe) (string, error) {
245225

@@ -248,6 +228,10 @@ func (g *LightningTerminal) Run() error {
248228
recipe.Permissions, recipe.Caveats,
249229
)
250230
},
231+
})
232+
if err != nil {
233+
return fmt.Errorf("could not create new session rpc "+
234+
"server: %v", err)
251235
}
252236

253237
// Overwrite the loop and pool daemon's user agent name so it sends
@@ -387,20 +371,6 @@ func (g *LightningTerminal) Run() error {
387371
return err
388372
}
389373

390-
// Now start up all previously created sessions. Since the sessions
391-
// require a lnd connection in order to bake macaroons, we can only
392-
// start up the sessions once the connection to lnd has been
393-
// established.
394-
sessions, err := g.sessionDB.ListSessions()
395-
if err != nil {
396-
return fmt.Errorf("error listing sessions: %v", err)
397-
}
398-
for _, sess := range sessions {
399-
if err := g.sessionRpcServer.resumeSession(sess); err != nil {
400-
return fmt.Errorf("error resuming sesion: %v", err)
401-
}
402-
}
403-
404374
// Now block until we receive an error or the main shutdown signal.
405375
select {
406376
case err := <-g.loopServer.ErrChan:
@@ -578,6 +548,11 @@ func (g *LightningTerminal) startSubservers() error {
578548
g.poolStarted = true
579549
}
580550

551+
if err = g.sessionRpcServer.start(); err != nil {
552+
return err
553+
}
554+
g.sessionRpcServerStarted = true
555+
581556
return nil
582557
}
583558

@@ -847,12 +822,12 @@ func (g *LightningTerminal) shutdown() error {
847822
}
848823
}
849824

850-
g.sessionRpcServer.stop()
851-
if err := g.sessionDB.Close(); err != nil {
852-
log.Errorf("Error closing session DB: %v", err)
853-
returnErr = err
825+
if g.sessionRpcServerStarted {
826+
if err := g.sessionRpcServer.stop(); err != nil {
827+
log.Errorf("Error closing session DB: %v", err)
828+
returnErr = err
829+
}
854830
}
855-
g.sessionServer.Stop()
856831

857832
if g.lndClient != nil {
858833
g.lndClient.Close()

0 commit comments

Comments
 (0)