Skip to content

Commit 8a6db16

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 8a6db16

File tree

3 files changed

+440
-84
lines changed

3 files changed

+440
-84
lines changed

src/handlers.rs

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,8 @@ pub(crate) async fn handle_online_wallet_subcommand(
607607
wallet: &mut Wallet,
608608
client: &BlockchainClient,
609609
online_subcommand: OnlineWalletSubCommand,
610+
datadir: Option<std::path::PathBuf>,
611+
wallet_name: String,
610612
) -> Result<String, Error> {
611613
match online_subcommand {
612614
FullScan {
@@ -724,7 +726,8 @@ pub(crate) async fn handle_online_wallet_subcommand(
724726
max_fee_rate,
725727
} => {
726728
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
727-
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager);
729+
let db = open_payjoin_db(datadir.clone(), &wallet_name)?;
730+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
728731
return payjoin_manager
729732
.receive_payjoin(amount, directory, max_fee_rate, ohttp_relay, client)
730733
.await;
@@ -735,11 +738,25 @@ pub(crate) async fn handle_online_wallet_subcommand(
735738
fee_rate,
736739
} => {
737740
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
738-
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager);
741+
let db = open_payjoin_db(datadir.clone(), &wallet_name)?;
742+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
739743
return payjoin_manager
740744
.send_payjoin(uri, fee_rate, ohttp_relay, client)
741745
.await;
742746
}
747+
ResumePayjoin {
748+
directory,
749+
ohttp_relay,
750+
session_id,
751+
} => {
752+
let relay_manager = Arc::new(Mutex::new(RelayManager::new()));
753+
let db = open_payjoin_db(datadir, &wallet_name)?;
754+
let mut payjoin_manager = PayjoinManager::new(wallet, relay_manager, db);
755+
return payjoin_manager
756+
.resume_payjoins(directory, ohttp_relay, session_id, client)
757+
.await;
758+
}
759+
PayjoinHistory => crate::payjoin::PayjoinManager::history(datadir, &wallet_name),
743760
}
744761
}
745762

@@ -1210,11 +1227,12 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12101227
wallet,
12111228
subcommand: WalletSubCommand::OnlineWalletSubCommand(online_subcommand),
12121229
} => {
1213-
let home_dir = prepare_home_dir(cli_opts.datadir)?;
1230+
let home_dir = prepare_home_dir(cli_opts.datadir.clone())?;
12141231

12151232
let (wallet_opts, network) = load_wallet_config(&home_dir, &wallet)?;
12161233

12171234
let database_path = prepare_wallet_db_dir(&home_dir, &wallet)?;
1235+
let wallet_name = wallet.clone();
12181236

12191237
#[cfg(any(feature = "sqlite", feature = "redb"))]
12201238
let result = {
@@ -1249,6 +1267,8 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12491267
&mut wallet,
12501268
&blockchain_client,
12511269
online_subcommand,
1270+
cli_opts.datadir.clone(),
1271+
wallet_name.clone(),
12521272
)
12531273
.await?;
12541274
wallet.persist(&mut persister)?;
@@ -1259,8 +1279,14 @@ pub(crate) async fn handle_command(cli_opts: CliOpts) -> Result<String, Error> {
12591279
let mut wallet = new_wallet(network, wallet_opts)?;
12601280
let blockchain_client =
12611281
crate::utils::new_blockchain_client(wallet_opts, &wallet, database_path)?;
1262-
handle_online_wallet_subcommand(&mut wallet, &blockchain_client, online_subcommand)
1263-
.await?
1282+
handle_online_wallet_subcommand(
1283+
&mut wallet,
1284+
&blockchain_client,
1285+
online_subcommand,
1286+
cli_opts.datadir.clone(),
1287+
wallet_name,
1288+
)
1289+
.await?
12641290
};
12651291
Ok(result)
12661292
}
@@ -1453,9 +1479,15 @@ async fn respond(
14531479
} => {
14541480
let blockchain =
14551481
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())?;
1482+
let value = handle_online_wallet_subcommand(
1483+
wallet,
1484+
&blockchain,
1485+
online_subcommand,
1486+
cli_opts.datadir.clone(),
1487+
wallet_name.clone(),
1488+
)
1489+
.await
1490+
.map_err(|e| e.to_string())?;
14591491
Some(value)
14601492
}
14611493
ReplSubCommand::Wallet {

0 commit comments

Comments
 (0)