Skip to content

Commit 58c425b

Browse files
committed
fix: catch esplora panics and return parsing error
1 parent fab37cc commit 58c425b

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

bdk-ffi/src/esplora.rs

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,20 @@ impl EsploraClient {
6060
.ok_or(EsploraError::RequestAlreadyConsumed)?;
6161

6262
let result: BdkFullScanResponse<KeychainKind> =
63-
self.0
64-
.full_scan(request, stop_gap as usize, parallel_requests as usize)?;
63+
std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
64+
self.0
65+
.full_scan(request, stop_gap as usize, parallel_requests as usize)
66+
}))
67+
.map_err(|payload| {
68+
let error_message = payload
69+
.downcast_ref::<String>()
70+
.map(String::as_str)
71+
.or_else(|| payload.downcast_ref::<&str>().copied())
72+
.unwrap_or("panic in esplora client")
73+
.to_string();
74+
75+
EsploraError::Parsing { error_message }
76+
})??;
6577

6678
let update = BdkUpdate {
6779
last_active_indices: result.last_active_indices,
@@ -90,7 +102,20 @@ impl EsploraClient {
90102
.take()
91103
.ok_or(EsploraError::RequestAlreadyConsumed)?;
92104

93-
let result: BdkSyncResponse = self.0.sync(request, parallel_requests as usize)?;
105+
let result: BdkSyncResponse =
106+
std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
107+
self.0.sync(request, parallel_requests as usize)
108+
}))
109+
.map_err(|payload| {
110+
let error_message = payload
111+
.downcast_ref::<String>()
112+
.map(String::as_str)
113+
.or_else(|| payload.downcast_ref::<&str>().copied())
114+
.unwrap_or("panic in esplora client")
115+
.to_string();
116+
117+
EsploraError::Parsing { error_message }
118+
})??;
94119

95120
let update = BdkUpdate {
96121
last_active_indices: BTreeMap::default(),

0 commit comments

Comments
 (0)