Skip to content

Commit 9878330

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 cd62e08 commit 9878330

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
@@ -190,6 +190,8 @@ pub enum BuildError {
190190
WalletSetupFailed,
191191
/// We failed to setup the logger.
192192
LoggerSetupFailed,
193+
/// We failed to setup the configured chain source.
194+
ChainSourceSetupFailed,
193195
/// The given network does not match the node's previously configured network.
194196
NetworkMismatch,
195197
/// The role of the node in an asynchronous payments context is not compatible with the current configuration.
@@ -217,6 +219,7 @@ impl fmt::Display for BuildError {
217219
Self::KVStoreSetupFailed => write!(f, "Failed to setup KVStore."),
218220
Self::WalletSetupFailed => write!(f, "Failed to setup onchain wallet."),
219221
Self::LoggerSetupFailed => write!(f, "Failed to setup the logger."),
222+
Self::ChainSourceSetupFailed => write!(f, "Failed to setup the chain source."),
220223
Self::InvalidNodeAlias => write!(f, "Given node alias is invalid."),
221224
Self::NetworkMismatch => {
222225
write!(f, "Given network does not match the node's previously configured network.")
@@ -1298,6 +1301,7 @@ fn build_with_store_internal(
12981301
Arc::clone(&logger),
12991302
Arc::clone(&node_metrics),
13001303
)
1304+
.map_err(|()| BuildError::ChainSourceSetupFailed)?
13011305
},
13021306
Some(ChainDataSourceConfig::Electrum { server_url, sync_config }) => {
13031307
let sync_config = sync_config.unwrap_or(ElectrumSyncConfig::default());
@@ -1367,6 +1371,7 @@ fn build_with_store_internal(
13671371
Arc::clone(&logger),
13681372
Arc::clone(&node_metrics),
13691373
)
1374+
.map_err(|()| BuildError::ChainSourceSetupFailed)?
13701375
},
13711376
};
13721377
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
@@ -46,7 +46,7 @@ impl EsploraChainSource {
4646
server_url: String, headers: HashMap<String, String>, sync_config: EsploraSyncConfig,
4747
fee_estimator: Arc<OnchainFeeEstimator>, kv_store: Arc<DynStore>, config: Arc<Config>,
4848
logger: Arc<Logger>, node_metrics: Arc<RwLock<NodeMetrics>>,
49-
) -> Self {
49+
) -> Result<Self, ()> {
5050
let mut client_builder = esplora_client::Builder::new(&server_url);
5151
client_builder =
5252
client_builder.timeout(sync_config.timeouts_config.per_request_timeout_secs as u64);
@@ -55,14 +55,15 @@ impl EsploraChainSource {
5555
client_builder = client_builder.header(header_name, header_value);
5656
}
5757

58-
#[allow(clippy::unwrap_used)]
59-
let esplora_client = client_builder.build_async().unwrap();
58+
let esplora_client = client_builder.build_async().map_err(|e| {
59+
log_error!(logger, "Failed to build Esplora client: {}", e);
60+
})?;
6061
let tx_sync =
6162
Arc::new(EsploraSyncClient::from_client(esplora_client.clone(), Arc::clone(&logger)));
6263

6364
let onchain_wallet_sync_status = Mutex::new(WalletSyncStatus::Completed);
6465
let lightning_wallet_sync_status = Mutex::new(WalletSyncStatus::Completed);
65-
Self {
66+
Ok(Self {
6667
sync_config,
6768
esplora_client,
6869
onchain_wallet_sync_status,
@@ -73,7 +74,7 @@ impl EsploraChainSource {
7374
config,
7475
logger,
7576
node_metrics,
76-
}
77+
})
7778
}
7879

7980
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
@@ -102,7 +102,7 @@ impl ChainSource {
102102
fee_estimator: Arc<OnchainFeeEstimator>, tx_broadcaster: Arc<Broadcaster>,
103103
kv_store: Arc<DynStore>, config: Arc<Config>, logger: Arc<Logger>,
104104
node_metrics: Arc<RwLock<NodeMetrics>>,
105-
) -> (Self, Option<BestBlock>) {
105+
) -> Result<(Self, Option<BestBlock>), ()> {
106106
let esplora_chain_source = EsploraChainSource::new(
107107
server_url,
108108
headers,
@@ -112,10 +112,10 @@ impl ChainSource {
112112
config,
113113
Arc::clone(&logger),
114114
node_metrics,
115-
);
115+
)?;
116116
let kind = ChainSourceKind::Esplora(esplora_chain_source);
117117
let registered_txids = Mutex::new(Vec::new());
118-
(Self { kind, registered_txids, tx_broadcaster, logger }, None)
118+
Ok((Self { kind, registered_txids, tx_broadcaster, logger }, None))
119119
}
120120

121121
pub(crate) fn new_electrum(

0 commit comments

Comments
 (0)