Skip to content

Commit 711fa1e

Browse files
committed
feat: integrate session persistence into payjoin workflow
- Add database initialization in handlers - Replace NoopSessionPersister with real persisters - Implement session resumption for existing sessions - Add input-seen-before tracking in receiver flow - Remove verbose error wrapping (use ? operator)
1 parent ebf2b71 commit 711fa1e

File tree

2 files changed

+185
-84
lines changed

2 files changed

+185
-84
lines changed

src/handlers.rs

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,16 @@ pub fn handle_offline_wallet_subcommand(
594594
}
595595
}
596596

597+
#[cfg(feature = "payjoin")]
598+
pub fn open_payjoin_db(
599+
datadir: Option<std::path::PathBuf>,
600+
) -> Result<std::sync::Arc<crate::payjoin::db::Database>, Error> {
601+
use crate::payjoin::db::{DB_FILENAME, Database};
602+
let home_dir = prepare_home_dir(datadir)?;
603+
let db_path = home_dir.join(DB_FILENAME);
604+
Ok(std::sync::Arc::new(Database::create(&db_path)?))
605+
}
606+
597607
/// Execute an online wallet sub-command
598608
///
599609
/// Online wallet sub-commands are described in [`OnlineWalletSubCommand`].
@@ -607,6 +617,7 @@ pub(crate) async fn handle_online_wallet_subcommand(
607617
wallet: &mut Wallet,
608618
client: &BlockchainClient,
609619
online_subcommand: OnlineWalletSubCommand,
620+
datadir: Option<std::path::PathBuf>,
610621
) -> Result<String, Error> {
611622
match online_subcommand {
612623
FullScan {
@@ -724,7 +735,8 @@ pub(crate) async fn handle_online_wallet_subcommand(
724735
max_fee_rate,
725736
} => {
726737
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
727-
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager);
738+
let db = open_payjoin_db(datadir.clone())?;
739+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
728740
return payjoin_manager
729741
.receive_payjoin(amount, directory, max_fee_rate, ohttp_relay, client)
730742
.await;
@@ -735,11 +747,25 @@ pub(crate) async fn handle_online_wallet_subcommand(
735747
fee_rate,
736748
} => {
737749
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
738-
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager);
750+
let db = open_payjoin_db(datadir.clone())?;
751+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
739752
return payjoin_manager
740753
.send_payjoin(uri, fee_rate, ohttp_relay, client)
741754
.await;
742755
}
756+
ResumePayjoin {
757+
directory,
758+
ohttp_relay,
759+
session_id,
760+
} => {
761+
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
762+
let db = open_payjoin_db(datadir)?;
763+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
764+
return payjoin_manager
765+
.resume_payjoins(directory, ohttp_relay, session_id, client)
766+
.await;
767+
}
768+
PayjoinHistory => crate::payjoin::PayjoinManager::history(datadir),
743769
}
744770
}
745771

@@ -1210,7 +1236,7 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12101236
wallet,
12111237
subcommand: WalletSubCommand::OnlineWalletSubCommand(online_subcommand),
12121238
} => {
1213-
let home_dir = prepare_home_dir(cli_opts.datadir)?;
1239+
let home_dir = prepare_home_dir(cli_opts.datadir.clone())?;
12141240

12151241
let (wallet_opts, network) = load_wallet_config(&home_dir, &wallet)?;
12161242

@@ -1249,6 +1275,7 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12491275
&mut wallet,
12501276
&blockchain_client,
12511277
online_subcommand,
1278+
cli_opts.datadir.clone(),
12521279
)
12531280
.await?;
12541281
wallet.persist(&mut persister)?;
@@ -1259,8 +1286,13 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12591286
let mut wallet = new_wallet(network, wallet_opts)?;
12601287
let blockchain_client =
12611288
crate::utils::new_blockchain_client(wallet_opts, &wallet, database_path)?;
1262-
handle_online_wallet_subcommand(&mut wallet, &blockchain_client, online_subcommand)
1263-
.await?
1289+
handle_online_wallet_subcommand(
1290+
&mut wallet,
1291+
&blockchain_client,
1292+
online_subcommand,
1293+
cli_opts.datadir.clone(),
1294+
)
1295+
.await?
12641296
};
12651297
Ok(result)
12661298
}
@@ -1453,9 +1485,14 @@ async fn respond(
14531485
} => {
14541486
let blockchain =
14551487
new_blockchain_client(wallet_opts, wallet, _datadir).map_err(|e| e.to_string())?;
1456-
let value = handle_online_wallet_subcommand(wallet, &blockchain, online_subcommand)
1457-
.await
1458-
.map_err(|e| e.to_string())?;
1488+
let value = handle_online_wallet_subcommand(
1489+
wallet,
1490+
&blockchain,
1491+
online_subcommand,
1492+
cli_opts.datadir.clone(),
1493+
)
1494+
.await
1495+
.map_err(|e| e.to_string())?;
14591496
Some(value)
14601497
}
14611498
ReplSubCommand::Wallet {

0 commit comments

Comments
 (0)