webapi: Create server when all components ready.

It's generally good practice to first create everything that can fail
and then create the final instance at once with the results versus doing
it piecemeal.

Piecemeal creation is typically more error prone and, while not a huge
concern here, it also ends up needlessly creating objects that are just
thrown away in the event of a later error.
This commit is contained in:
jholdstock 2023-09-15 09:41:14 +01:00 committed by Jamie Holdstock
parent a9f517f787
commit 8a8cbe47b9

View File

@ -79,24 +79,16 @@ func Start(ctx context.Context, requestShutdown func(), shutdownWg *sync.WaitGro
vdb *database.VspDatabase, log slog.Logger, dcrd rpc.DcrdConnect, vdb *database.VspDatabase, log slog.Logger, dcrd rpc.DcrdConnect,
wallets rpc.WalletConnect, cfg Config) error { wallets rpc.WalletConnect, cfg Config) error {
s := &server{
cfg: cfg,
db: vdb,
log: log,
}
var err error
// Get keys for signing API responses from the database. // Get keys for signing API responses from the database.
s.signPrivKey, s.signPubKey, err = vdb.KeyPair() signPrivKey, signPubKey, err := vdb.KeyPair()
if err != nil { if err != nil {
return fmt.Errorf("db.Keypair error: %w", err) return fmt.Errorf("db.Keypair error: %w", err)
} }
// Populate cached VSP stats before starting webserver. // Populate cached VSP stats before starting webserver.
encodedPubKey := base64.StdEncoding.EncodeToString(s.signPubKey) encodedPubKey := base64.StdEncoding.EncodeToString(signPubKey)
s.cache = newCache(encodedPubKey, log, vdb, dcrd, wallets) cache := newCache(encodedPubKey, log, vdb, dcrd, wallets)
err = s.cache.update() err = cache.update()
if err != nil { if err != nil {
log.Errorf("Could not initialize VSP stats cache: %v", err) log.Errorf("Could not initialize VSP stats cache: %v", err)
} }
@ -111,7 +103,7 @@ func Start(ctx context.Context, requestShutdown func(), shutdownWg *sync.WaitGro
if err != nil { if err != nil {
return fmt.Errorf("db.GetFeeXPub error: %w", err) return fmt.Errorf("db.GetFeeXPub error: %w", err)
} }
s.addrGen, err = newAddressGenerator(feeXPub, cfg.Network.Params, idx, log) addrGen, err := newAddressGenerator(feeXPub, cfg.Network.Params, idx, log)
if err != nil { if err != nil {
return fmt.Errorf("failed to initialize fee address generator: %w", err) return fmt.Errorf("failed to initialize fee address generator: %w", err)
} }
@ -122,6 +114,16 @@ func Start(ctx context.Context, requestShutdown func(), shutdownWg *sync.WaitGro
return fmt.Errorf("db.GetCookieSecret error: %w", err) return fmt.Errorf("db.GetCookieSecret error: %w", err)
} }
s := &server{
cfg: cfg,
db: vdb,
log: log,
addrGen: addrGen,
cache: cache,
signPrivKey: signPrivKey,
signPubKey: signPubKey,
}
// Create TCP listener. // Create TCP listener.
var listenConfig net.ListenConfig var listenConfig net.ListenConfig
listener, err := listenConfig.Listen(ctx, "tcp", cfg.Listen) listener, err := listenConfig.Listen(ctx, "tcp", cfg.Listen)