Skip to content

Commit 1ce86ac

Browse files
committed
Propagate Esplora client setup failures
Return Esplora client construction failures through build-time error handling instead of panicking so invalid headers or reqwest setup errors fail node construction cleanly. Co-Authored-By: HAL 9000
1 parent 0958a33 commit 1ce86ac

File tree

3 files changed

+14
-8
lines changed

3 files changed

+14
-8
lines changed

src/builder.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@ pub enum BuildError {
189189
WalletSetupFailed,
190190
/// We failed to setup the logger.
191191
LoggerSetupFailed,
192+
/// We failed to setup the configured chain source.
193+
ChainSourceSetupFailed,
192194
/// The given network does not match the node's previously configured network.
193195
NetworkMismatch,
194196
/// The role of the node in an asynchronous payments context is not compatible with the current configuration.
@@ -216,6 +218,7 @@ impl fmt::Display for BuildError {
216218
Self::KVStoreSetupFailed => write!(f, "Failed to setup KVStore."),
217219
Self::WalletSetupFailed => write!(f, "Failed to setup onchain wallet."),
218220
Self::LoggerSetupFailed => write!(f, "Failed to setup the logger."),
221+
Self::ChainSourceSetupFailed => write!(f, "Failed to setup the chain source."),
219222
Self::InvalidNodeAlias => write!(f, "Given node alias is invalid."),
220223
Self::NetworkMismatch => {
221224
write!(f, "Given network does not match the node's previously configured network.")
@@ -1314,6 +1317,7 @@ fn build_with_store_internal(
13141317
Arc::clone(&logger),
13151318
Arc::clone(&node_metrics),
13161319
)
1320+
.map_err(|()| BuildError::ChainSourceSetupFailed)?
13171321
},
13181322
Some(ChainDataSourceConfig::Electrum { server_url, sync_config }) => {
13191323
let sync_config = sync_config.unwrap_or(ElectrumSyncConfig::default());
@@ -1383,6 +1387,7 @@ fn build_with_store_internal(
13831387
Arc::clone(&logger),
13841388
Arc::clone(&node_metrics),
13851389
)
1390+
.map_err(|()| BuildError::ChainSourceSetupFailed)?
13861391
},
13871392
};
13881393
let chain_source = Arc::new(chain_source);

src/chain/esplora.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ impl EsploraChainSource {
4545
server_url: String, headers: HashMap<String, String>, sync_config: EsploraSyncConfig,
4646
fee_estimator: Arc<OnchainFeeEstimator>, kv_store: Arc<DynStore>, config: Arc<Config>,
4747
logger: Arc<Logger>, node_metrics: Arc<RwLock<NodeMetrics>>,
48-
) -> Self {
48+
) -> Result<Self, ()> {
4949
let mut client_builder = esplora_client::Builder::new(&server_url);
5050
client_builder =
5151
client_builder.timeout(sync_config.timeouts_config.per_request_timeout_secs as u64);
@@ -54,14 +54,15 @@ impl EsploraChainSource {
5454
client_builder = client_builder.header(header_name, header_value);
5555
}
5656

57-
let esplora_client =
58-
client_builder.build_async().expect("esplora client build must succeed");
57+
let esplora_client = client_builder.build_async().map_err(|e| {
58+
log_error!(logger, "Failed to build Esplora client: {}", e);
59+
})?;
5960
let tx_sync =
6061
Arc::new(EsploraSyncClient::from_client(esplora_client.clone(), Arc::clone(&logger)));
6162

6263
let onchain_wallet_sync_status = Mutex::new(WalletSyncStatus::Completed);
6364
let lightning_wallet_sync_status = Mutex::new(WalletSyncStatus::Completed);
64-
Self {
65+
Ok(Self {
6566
sync_config,
6667
esplora_client,
6768
onchain_wallet_sync_status,
@@ -72,7 +73,7 @@ impl EsploraChainSource {
7273
config,
7374
logger,
7475
node_metrics,
75-
}
76+
})
7677
}
7778

7879
pub(super) async fn sync_onchain_wallet(

src/chain/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl ChainSource {
101101
fee_estimator: Arc<OnchainFeeEstimator>, tx_broadcaster: Arc<Broadcaster>,
102102
kv_store: Arc<DynStore>, config: Arc<Config>, logger: Arc<Logger>,
103103
node_metrics: Arc<RwLock<NodeMetrics>>,
104-
) -> (Self, Option<BestBlock>) {
104+
) -> Result<(Self, Option<BestBlock>), ()> {
105105
let esplora_chain_source = EsploraChainSource::new(
106106
server_url,
107107
headers,
@@ -111,10 +111,10 @@ impl ChainSource {
111111
config,
112112
Arc::clone(&logger),
113113
node_metrics,
114-
);
114+
)?;
115115
let kind = ChainSourceKind::Esplora(esplora_chain_source);
116116
let registered_txids = Mutex::new(Vec::new());
117-
(Self { kind, registered_txids, tx_broadcaster, logger }, None)
117+
Ok((Self { kind, registered_txids, tx_broadcaster, logger }, None))
118118
}
119119

120120
pub(crate) fn new_electrum(

0 commit comments

Comments
 (0)