Skip to content

Commit f291c11

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 d8db75b commit f291c11

3 files changed

Lines changed: 440 additions & 84 deletions

File tree

src/handlers.rs

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,8 @@ pub(crate) async fn handle_online_wallet_subcommand(
654654
wallet: &mut Wallet,
655655
client: &BlockchainClient,
656656
online_subcommand: OnlineWalletSubCommand,
657+
datadir: Option<std::path::PathBuf>,
658+
wallet_name: String,
657659
) -> Result<String, Error> {
658660
match online_subcommand {
659661
FullScan {
@@ -771,7 +773,8 @@ pub(crate) async fn handle_online_wallet_subcommand(
771773
max_fee_rate,
772774
} => {
773775
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
774-
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager);
776+
let db = open_payjoin_db(datadir.clone(), &wallet_name)?;
777+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
775778
return payjoin_manager
776779
.receive_payjoin(amount, directory, max_fee_rate, ohttp_relay, client)
777780
.await;
@@ -782,11 +785,25 @@ pub(crate) async fn handle_online_wallet_subcommand(
782785
fee_rate,
783786
} => {
784787
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
785-
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager);
788+
let db = open_payjoin_db(datadir.clone(), &wallet_name)?;
789+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
786790
return payjoin_manager
787791
.send_payjoin(uri, fee_rate, ohttp_relay, client)
788792
.await;
789793
}
794+
ResumePayjoin {
795+
directory,
796+
ohttp_relay,
797+
session_id,
798+
} => {
799+
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
800+
let db = open_payjoin_db(datadir, &wallet_name)?;
801+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
802+
return payjoin_manager
803+
.resume_payjoins(directory, ohttp_relay, session_id, client)
804+
.await;
805+
}
806+
PayjoinHistory => crate::payjoin::PayjoinManager::history(datadir, &wallet_name),
790807
}
791808
}
792809

@@ -1257,11 +1274,12 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12571274
wallet,
12581275
subcommand: WalletSubCommand::OnlineWalletSubCommand(online_subcommand),
12591276
} => {
1260-
let home_dir = prepare_home_dir(cli_opts.datadir)?;
1277+
let home_dir = prepare_home_dir(cli_opts.datadir.clone())?;
12611278

12621279
let (wallet_opts, network) = load_wallet_config(&home_dir, &wallet)?;
12631280

12641281
let database_path = prepare_wallet_db_dir(&home_dir, &wallet)?;
1282+
let wallet_name = wallet.clone();
12651283

12661284
#[cfg(any(feature = "sqlite", feature = "redb"))]
12671285
let result = {
@@ -1296,6 +1314,8 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12961314
&mut wallet,
12971315
&blockchain_client,
12981316
online_subcommand,
1317+
cli_opts.datadir.clone(),
1318+
wallet_name.clone(),
12991319
)
13001320
.await?;
13011321
wallet.persist(&mut persister)?;
@@ -1306,8 +1326,14 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
13061326
let mut wallet = new_wallet(network, wallet_opts)?;
13071327
let blockchain_client =
13081328
crate::utils::new_blockchain_client(wallet_opts, &wallet, database_path)?;
1309-
handle_online_wallet_subcommand(&mut wallet, &blockchain_client, online_subcommand)
1310-
.await?
1329+
handle_online_wallet_subcommand(
1330+
&mut wallet,
1331+
&blockchain_client,
1332+
online_subcommand,
1333+
cli_opts.datadir.clone(),
1334+
wallet_name,
1335+
)
1336+
.await?
13111337
};
13121338
Ok(result)
13131339
}
@@ -1510,9 +1536,15 @@ async fn respond(
15101536
} => {
15111537
let blockchain =
15121538
new_blockchain_client(wallet_opts, wallet, _datadir).map_err(|e| e.to_string())?;
1513-
let value = handle_online_wallet_subcommand(wallet, &blockchain, online_subcommand)
1514-
.await
1515-
.map_err(|e| e.to_string())?;
1539+
let value = handle_online_wallet_subcommand(
1540+
wallet,
1541+
&blockchain,
1542+
online_subcommand,
1543+
cli_opts.datadir.clone(),
1544+
wallet_name.clone(),
1545+
)
1546+
.await
1547+
.map_err(|e| e.to_string())?;
15161548
Some(value)
15171549
}
15181550
ReplSubCommand::Wallet {

0 commit comments

Comments
 (0)