Skip to content

Commit dd72039

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 fb7f6c6 commit dd72039

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
@@ -159,7 +159,15 @@ pub(crate) enum BlockchainClient {
159159
},
160160

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

165173
#[cfg(any(
@@ -216,13 +224,32 @@ pub(crate) fn new_blockchain_client(
216224
let scan_type = Sync;
217225
let builder = Builder::new(_wallet.network());
218226

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

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

335362
// Handle Kyoto Client sync
336363
#[cfg(feature = "cbf")]
337-
pub async fn sync_kyoto_client(wallet: &mut Wallet, client: Box<LightClient>) -> Result<(), Error> {
338-
let LightClient {
339-
requester,
340-
info_subscriber,
341-
warning_subscriber,
342-
mut update_subscriber,
343-
node,
344-
} = *client;
345-
346-
let subscriber = tracing_subscriber::FmtSubscriber::new();
347-
tracing::subscriber::set_global_default(subscriber)
348-
.map_err(|e| Error::Generic(format!("SetGlobalDefault error: {e}")))?;
349-
350-
tokio::task::spawn(async move { node.run().await });
351-
tokio::task::spawn(async move { trace_logger(info_subscriber, warning_subscriber).await });
352-
353-
if !requester.is_running() {
364+
pub async fn sync_kyoto_client(
365+
wallet: &mut Wallet,
366+
handle: &KyotoClientHandle,
367+
) -> Result<(), Error> {
368+
if !handle.requester.is_running() {
354369
tracing::error!("Kyoto node is not running");
355370
return Err(Error::Generic("Kyoto node failed to start".to_string()));
356371
}
357372
tracing::info!("Kyoto node is running");
358373

359-
let update = update_subscriber.update().await?;
374+
let update = handle.update_subscriber.lock().await.update().await?;
360375
tracing::info!("Received update: applying to wallet");
361376
wallet
362377
.apply_update(update)

0 commit comments

Comments
 (0)