Skip to content

Commit 7d2f8d4

Browse files
feat: expose filters
1 parent d8e7eb4 commit 7d2f8d4

File tree

2 files changed

+19
-24
lines changed

2 files changed

+19
-24
lines changed

dash-spv-ffi/src/client.rs

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1331,27 +1331,22 @@ pub unsafe extern "C" fn dash_spv_ffi_client_load_filters(
13311331
let inner = client.inner.clone();
13321332

13331333
let result = client.runtime.block_on(async {
1334-
let spv_client = {
1335-
let mut guard = inner.lock().unwrap();
1336-
match guard.take() {
1337-
Some(client) => client,
1334+
// Get storage reference without taking the client
1335+
let storage = {
1336+
let guard = inner.lock().unwrap();
1337+
match guard.as_ref() {
1338+
Some(client) => client.storage(),
13381339
None => {
13391340
set_last_error("Client not initialized");
13401341
return None;
13411342
}
13421343
}
13431344
};
13441345

1345-
// Get the storage
1346-
let storage = spv_client.storage();
1346+
// Access storage directly - works even during sync
13471347
let storage_guard = storage.lock().await;
1348-
1349-
// Load filters in range
13501348
let filters_result = storage_guard.load_filters(start_height..end_height).await;
1351-
1352-
// Put the client back
1353-
let mut guard = inner.lock().unwrap();
1354-
*guard = Some(spv_client);
1349+
drop(storage_guard);
13551350

13561351
match filters_result {
13571352
Ok(filters) => {
@@ -1723,27 +1718,21 @@ pub unsafe extern "C" fn dash_spv_ffi_client_get_filter_matched_heights(
17231718
let inner = client.inner.clone();
17241719

17251720
let result = client.runtime.block_on(async {
1726-
let spv_client = {
1727-
let mut guard = inner.lock().unwrap();
1728-
match guard.take() {
1729-
Some(client) => client,
1721+
// Get chain state without taking the client
1722+
let chain_state = {
1723+
let guard = inner.lock().unwrap();
1724+
match guard.as_ref() {
1725+
Some(client) => client.chain_state().await,
17301726
None => {
17311727
set_last_error("Client not initialized");
17321728
return None;
17331729
}
17341730
}
17351731
};
17361732

1737-
// Get the chain state
1738-
let chain_state = spv_client.chain_state().await;
1739-
1740-
// Get filter matches in range
1733+
// Get filter matches in range - works even during sync
17411734
let matches_result = chain_state.get_filter_matched_heights(start_height..end_height);
17421735

1743-
// Put the client back
1744-
let mut guard = inner.lock().unwrap();
1745-
*guard = Some(spv_client);
1746-
17471736
match matches_result {
17481737
Ok(matches) => {
17491738
// Convert BTreeMap to FFI format

dash-spv/src/sync/sequential/message_handlers.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,12 @@ impl<
604604
return Ok(());
605605
}
606606

607+
// Store the filter to disk for persistence
608+
storage
609+
.store_filter(height, &cfilter.filter)
610+
.await
611+
.map_err(|e| SyncError::Storage(format!("Failed to store filter: {}", e)))?;
612+
607613
let matches = self
608614
.filter_sync
609615
.check_filter_for_matches(

0 commit comments

Comments
 (0)