Skip to content

Commit 68af3e6

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 2e74115 commit 68af3e6

File tree

2 files changed

+187
-84
lines changed

2 files changed

+187
-84
lines changed

src/handlers.rs

Lines changed: 47 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,27 @@ 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 => {
769+
return crate::payjoin::PayjoinManager::history(datadir);
770+
}
743771
}
744772
}
745773

@@ -1209,7 +1237,7 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12091237
wallet,
12101238
subcommand: WalletSubCommand::OnlineWalletSubCommand(online_subcommand),
12111239
} => {
1212-
let home_dir = prepare_home_dir(cli_opts.datadir)?;
1240+
let home_dir = prepare_home_dir(cli_opts.datadir.clone())?;
12131241

12141242
let (wallet_opts, network) = load_wallet_config(&home_dir, &wallet)?;
12151243

@@ -1248,6 +1276,7 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12481276
&mut wallet,
12491277
&blockchain_client,
12501278
online_subcommand,
1279+
cli_opts.datadir.clone(),
12511280
)
12521281
.await?;
12531282
wallet.persist(&mut persister)?;
@@ -1258,8 +1287,13 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12581287
let mut wallet = new_wallet(network, wallet_opts)?;
12591288
let blockchain_client =
12601289
crate::utils::new_blockchain_client(wallet_opts, &wallet, database_path)?;
1261-
handle_online_wallet_subcommand(&mut wallet, &blockchain_client, online_subcommand)
1262-
.await?
1290+
handle_online_wallet_subcommand(
1291+
&mut wallet,
1292+
&blockchain_client,
1293+
online_subcommand,
1294+
cli_opts.datadir.clone(),
1295+
)
1296+
.await?
12631297
};
12641298
Ok(result)
12651299
}
@@ -1452,9 +1486,14 @@ async fn respond(
14521486
} => {
14531487
let blockchain =
14541488
new_blockchain_client(wallet_opts, wallet, _datadir).map_err(|e| e.to_string())?;
1455-
let value = handle_online_wallet_subcommand(wallet, &blockchain, online_subcommand)
1456-
.await
1457-
.map_err(|e| e.to_string())?;
1489+
let value = handle_online_wallet_subcommand(
1490+
wallet,
1491+
&blockchain,
1492+
online_subcommand,
1493+
cli_opts.datadir.clone(),
1494+
)
1495+
.await
1496+
.map_err(|e| e.to_string())?;
14581497
Some(value)
14591498
}
14601499
ReplSubCommand::Wallet {

0 commit comments

Comments
 (0)