Skip to content

Commit 99b71fd

Browse files
committed
refactor: use handle pattern for Kyoto client
Refactor KyotoClient to use a KyotoClientHandle struct instead of Box<LightClient>. Previously, the Box<LightClient> was consumed when destructured in sync_kyoto_client, preventing the function from being called multiple times or borrowed. With the handle pattern, sync_kyoto_client now takes &mut KyotoClientHandle, allowing it to be borrowed and reused. This also allows the node to be started at creation time in new_blockchain_client rather than during sync, making the client ready for use immediately after creation. - Add KyotoClientHandle struct containing requester and update_subscriber - Move node startup and logger spawning to new_blockchain_client - Update sync_kyoto_client to accept &mut KyotoClientHandle instead of consuming Box<LightClient>
1 parent b9cf2ac commit 99b71fd

File tree

1 file changed

+36
-21
lines changed

1 file changed

+36
-21
lines changed

src/utils.rs

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,15 @@ pub(crate) enum BlockchainClient {
158158
},
159159

160160
#[cfg(feature = "cbf")]
161-
KyotoClient { client: Box<LightClient> },
161+
KyotoClient { client: KyotoClientHandle },
162+
}
163+
164+
/// Handle for the Kyoto client after the node has been started.
165+
/// Contains only the components needed for sync and broadcast operations.
166+
#[cfg(feature = "cbf")]
167+
pub struct KyotoClientHandle {
168+
pub requester: bdk_kyoto::Requester,
169+
pub update_subscriber: tokio::sync::Mutex<bdk_kyoto::UpdateSubscriber>,
162170
}
163171

164172
#[cfg(any(
@@ -215,13 +223,32 @@ pub(crate) fn new_blockchain_client(
215223
let scan_type = Sync;
216224
let builder = Builder::new(_wallet.network());
217225

218-
let client = builder
226+
let light_client = builder
219227
.required_peers(wallet_opts.compactfilter_opts.conn_count)
220228
.data_dir(&_datadir)
221229
.build_with_wallet(_wallet, scan_type)?;
222230

231+
let LightClient {
232+
requester,
233+
info_subscriber,
234+
warning_subscriber,
235+
update_subscriber,
236+
node,
237+
} = light_client;
238+
239+
let subscriber = tracing_subscriber::FmtSubscriber::new();
240+
let _ = tracing::subscriber::set_global_default(subscriber);
241+
242+
tokio::task::spawn(async move { node.run().await });
243+
tokio::task::spawn(
244+
async move { trace_logger(info_subscriber, warning_subscriber).await },
245+
);
246+
223247
BlockchainClient::KyotoClient {
224-
client: Box::new(client),
248+
client: KyotoClientHandle {
249+
requester,
250+
update_subscriber: tokio::sync::Mutex::new(update_subscriber),
251+
},
225252
}
226253
}
227254
};
@@ -318,29 +345,17 @@ pub async fn trace_logger(
318345

319346
// Handle Kyoto Client sync
320347
#[cfg(feature = "cbf")]
321-
pub async fn sync_kyoto_client(wallet: &mut Wallet, client: Box<LightClient>) -> Result<(), Error> {
322-
let LightClient {
323-
requester,
324-
info_subscriber,
325-
warning_subscriber,
326-
mut update_subscriber,
327-
node,
328-
} = *client;
329-
330-
let subscriber = tracing_subscriber::FmtSubscriber::new();
331-
tracing::subscriber::set_global_default(subscriber)
332-
.map_err(|e| Error::Generic(format!("SetGlobalDefault error: {e}")))?;
333-
334-
tokio::task::spawn(async move { node.run().await });
335-
tokio::task::spawn(async move { trace_logger(info_subscriber, warning_subscriber).await });
336-
337-
if !requester.is_running() {
348+
pub async fn sync_kyoto_client(
349+
wallet: &mut Wallet,
350+
handle: &KyotoClientHandle,
351+
) -> Result<(), Error> {
352+
if !handle.requester.is_running() {
338353
tracing::error!("Kyoto node is not running");
339354
return Err(Error::Generic("Kyoto node failed to start".to_string()));
340355
}
341356
tracing::info!("Kyoto node is running");
342357

343-
let update = update_subscriber.update().await?;
358+
let update = handle.update_subscriber.lock().await.update().await?;
344359
tracing::info!("Received update: applying to wallet");
345360
wallet
346361
.apply_update(update)

0 commit comments

Comments
 (0)