Просмотр исходного кода

drk/rpc: add progress publisher argument to `scan_blocks()`

You can subscribe to this publisher to listen to scan progress.
epiphany 2 месяцев назад
Родитель
Сommit
2899991891
3 измененных файлов с 9 добавлено и 5 удалено
  1. 1 1
      bin/drk/src/interactive.rs
  2. 1 1
      bin/drk/src/main.rs
  3. 7 3
      bin/drk/src/rpc.rs

+ 1 - 1
bin/drk/src/interactive.rs

@@ -2600,7 +2600,7 @@ async fn handle_scan(
         append_or_print(output, None, print, buf).await;
     }
 
-    if let Err(e) = lock.scan_blocks(output, None, print).await {
+    if let Err(e) = lock.scan_blocks(output, None, print, None).await {
         append_or_print(output, None, print, vec![format!("Failed during scanning: {e}")]).await;
         return
     }

+ 1 - 1
bin/drk/src/main.rs

@@ -2117,7 +2117,7 @@ async fn realmain(args: Args, ex: ExecutorPtr) -> Result<()> {
                 print_output(&buf);
             }
 
-            if let Err(e) = drk.scan_blocks(&mut vec![], None, &true).await {
+            if let Err(e) = drk.scan_blocks(&mut vec![], None, &true, None).await {
                 eprintln!("Failed during scanning: {e}");
                 exit(2);
             }

+ 7 - 3
bin/drk/src/rpc.rs

@@ -32,7 +32,7 @@ use darkfi::{
         jsonrpc::{ErrorCode, JsonError, JsonRequest, JsonResult},
         util::JsonValue,
     },
-    system::{ExecutorPtr, Publisher, StoppableTaskPtr},
+    system::{ExecutorPtr, Publisher, PublisherPtr, StoppableTaskPtr},
     tx::Transaction,
     util::encoding::base64,
     Error, Result,
@@ -305,6 +305,7 @@ impl Drk {
         output: &mut Vec<String>,
         sender: Option<&Sender<Vec<String>>>,
         print: &bool,
+        progress_pub: Option<PublisherPtr<(u32, u32)>>,
     ) -> WalletDbResult<()> {
         // Grab last scanned block height
         let (mut height, hash) = self.get_last_scanned_block()?;
@@ -428,6 +429,9 @@ impl Drk {
                     buf.push(msg);
                 }
                 append_or_print(output, sender, print, buf).await;
+                if let Some(ref progress) = progress_pub {
+                    progress.notify((height, last_height)).await;
+                }
                 height += 1;
             }
         }
@@ -632,7 +636,7 @@ pub async fn subscribe_blocks(
 ) -> Result<()> {
     // First we do a clean scan
     let lock = drk.read().await;
-    if let Err(e) = lock.scan_blocks(&mut vec![], Some(&shell_sender), &false).await {
+    if let Err(e) = lock.scan_blocks(&mut vec![], Some(&shell_sender), &false, None).await {
         let err_msg = format!("Failed during scanning: {e}");
         shell_sender.send(vec![err_msg.clone()]).await?;
         return Err(Error::Custom(err_msg))
@@ -644,7 +648,7 @@ pub async fn subscribe_blocks(
 
     // Handle genesis(0) block
     if last_confirmed_height == 0 {
-        if let Err(e) = lock.scan_blocks(&mut vec![], Some(&shell_sender), &false).await {
+        if let Err(e) = lock.scan_blocks(&mut vec![], Some(&shell_sender), &false, None).await {
             let err_msg = format!("[subscribe_blocks] Scanning from genesis block failed: {e}");
             shell_sender.send(vec![err_msg.clone()]).await?;
             return Err(Error::Custom(err_msg))