From ec9a8f45febe80343f41caecf68db822e03a31ad Mon Sep 17 00:00:00 2001 From: skoupidi Date: Tue, 4 Jun 2024 16:29:44 +0300 Subject: [PATCH] drk: properly stop rpc client on termination --- bin/drk/src/main.rs | 59 ++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/bin/drk/src/main.rs b/bin/drk/src/main.rs index 391a5929f..81ba7b3e8 100644 --- a/bin/drk/src/main.rs +++ b/bin/drk/src/main.rs @@ -610,12 +610,20 @@ impl Drk { println!("Executing ping request to darkfid..."); let latency = Instant::now(); let req = JsonRequest::new("ping", JsonValue::Array(vec![])); - let rep = self.rpc_client.as_ref().unwrap().oneshot_request(req).await?; + let rep = self.rpc_client.as_ref().unwrap().request(req).await?; let latency = latency.elapsed(); println!("Got reply: {rep:?}"); println!("Latency: {latency:?}"); Ok(()) } + + /// Auxiliary function to stop current JSON-RPC client, if its initialized. + async fn stop_rpc_client(&self) -> Result<()> { + if let Some(ref rpc_client) = self.rpc_client { + rpc_client.stop().await; + }; + Ok(()) + } } async_daemonize!(realmain); @@ -628,7 +636,8 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { Subcmd::Ping => { let drk = Drk::new(args.wallet_path, args.wallet_pass, Some(args.endpoint), ex).await?; - drk.ping().await + drk.ping().await?; + drk.stop_rpc_client().await } Subcmd::Completions { shell } => generate_completions(&shell), @@ -882,7 +891,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { Subcmd::Spend => { let tx = parse_tx_from_stdin().await?; - let drk = Drk::new(args.wallet_path, args.wallet_pass, Some(args.endpoint), ex).await?; + let drk = Drk::new(args.wallet_path, args.wallet_pass, None, ex).await?; if let Err(e) = drk.mark_tx_spend(&tx).await { eprintln!("Failed to mark transaction coins as spent: {e:?}"); @@ -988,7 +997,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } Subcmd::Otc { command } => match command { @@ -1007,7 +1016,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { }; println!("{}", base64::encode(&serialize_async(&half).await)); - Ok(()) + drk.stop_rpc_client().await } OtcSubcmd::Join => { @@ -1031,7 +1040,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { }; println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } OtcSubcmd::Inspect => { @@ -1206,7 +1215,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { }; println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } DaoSubcmd::ProposeTransfer { @@ -1289,7 +1298,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("Generated proposal: {}", proposal.bulla()); - Ok(()) + drk.stop_rpc_client().await } DaoSubcmd::Proposals { name } => { @@ -1330,7 +1339,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { // Export it to base64 println!("{}", base64::encode(&serialize_async(&enc_note).await)); - return Ok(()) + return drk.stop_rpc_client().await } if mint_proposal { @@ -1345,7 +1354,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { }; println!("{}", base64::encode(&serialize_async(&tx).await)); - return Ok(()) + return drk.stop_rpc_client().await } } @@ -1467,7 +1476,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { if let Some(exec_tx_hash) = proposal.exec_tx_hash { println!("Proposal was executed on transaction: {exec_tx_hash}"); - return Ok(()) + return drk.stop_rpc_client().await } // Retrieve current block height and compute current window @@ -1482,7 +1491,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("Voting status: {voting_status}"); println!("{proposal_status_message}"); - Ok(()) + drk.stop_rpc_client().await } DaoSubcmd::ProposalImport {} => { @@ -1557,7 +1566,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { }; println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } DaoSubcmd::Exec { bulla } => { @@ -1584,7 +1593,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { }; println!("{}", base64::encode(&serialize_async(&tx).await)); - return Ok(()) + return drk.stop_rpc_client().await } } @@ -1614,7 +1623,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } Subcmd::Inspect => { @@ -1650,7 +1659,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("Transaction ID: {txid}"); - Ok(()) + drk.stop_rpc_client().await } Subcmd::Subscribe => { @@ -1667,7 +1676,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { exit(2); } - Ok(()) + drk.stop_rpc_client().await } Subcmd::Scan { reset } => { @@ -1681,7 +1690,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { } println!("Finished scanning blockchain"); - return Ok(()) + return drk.stop_rpc_client().await } if let Err(e) = drk.scan_blocks(false).await { @@ -1690,7 +1699,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { } println!("Finished scanning blockchain"); - Ok(()) + drk.stop_rpc_client().await } Subcmd::Explorer { command } => match command { @@ -1726,7 +1735,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("{tx:?}"); } - Ok(()) + drk.stop_rpc_client().await } ExplorerSubcmd::SimulateTx => { @@ -1746,7 +1755,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("Transaction ID: {}", tx.hash()); println!("State: {}", if is_valid { "valid" } else { "invalid" }); - Ok(()) + drk.stop_rpc_client().await } ExplorerSubcmd::TxsHistory { tx_hash, encode } => { @@ -2002,7 +2011,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } TokenSubcmd::Freeze { token } => { @@ -2026,7 +2035,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } }, @@ -2086,7 +2095,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } ContractSubcmd::Lock { deploy_auth } => { @@ -2108,7 +2117,7 @@ async fn realmain(args: Args, ex: Arc>) -> Result<()> { println!("{}", base64::encode(&serialize_async(&tx).await)); - Ok(()) + drk.stop_rpc_client().await } }, }