Skip to content

Commit bc158e4

Browse files
committed
Move persistence logic into separate module file
Move persistence-related code out of `v2::Sender` and `v2::Receiver` into dedicated `persist.rs` files. This refactor helps declutter the core API and separates unrelated concerns. This change addresses a follow-up item from the [PR that introduced persistence](payjoin#552 (comment)).
1 parent 55a4b7e commit bc158e4

File tree

6 files changed

+111
-91
lines changed

6 files changed

+111
-91
lines changed

payjoin/src/receive/v2/mod.rs

Lines changed: 3 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//! Receive BIP 77 Payjoin v2
2-
use std::fmt::{self, Display};
32
use std::str::FromStr;
43
use std::time::{Duration, SystemTime};
54

@@ -8,6 +7,7 @@ use bitcoin::psbt::Psbt;
87
use bitcoin::{Address, FeeRate, OutPoint, Script, TxOut};
98
pub(crate) use error::InternalSessionError;
109
pub use error::SessionError;
10+
pub use persist::ReceiverToken;
1111
use serde::de::Deserializer;
1212
use serde::{Deserialize, Serialize};
1313
use url::Url;
@@ -20,12 +20,13 @@ use super::{
2020
use crate::hpke::{decrypt_message_a, encrypt_message_b, HpkeKeyPair, HpkePublicKey};
2121
use crate::ohttp::{ohttp_decapsulate, ohttp_encapsulate, OhttpEncapsulationError, OhttpKeys};
2222
use crate::output_substitution::OutputSubstitution;
23-
use crate::persist::{self, Persister};
23+
use crate::persist::Persister;
2424
use crate::receive::{parse_payload, InputPair};
2525
use crate::uri::ShortId;
2626
use crate::{IntoUrl, IntoUrlError, Request};
2727

2828
mod error;
29+
mod persist;
2930

3031
const SUPPORTED_VERSIONS: &[usize] = &[1, 2];
3132

@@ -129,28 +130,6 @@ pub struct Receiver {
129130
context: SessionContext,
130131
}
131132

132-
/// Opaque key type for the receiver
133-
#[derive(Debug, Clone, PartialEq, Eq)]
134-
pub struct ReceiverToken(ShortId);
135-
136-
impl Display for ReceiverToken {
137-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
138-
}
139-
140-
impl From<Receiver> for ReceiverToken {
141-
fn from(receiver: Receiver) -> Self { ReceiverToken(id(&receiver.context.s)) }
142-
}
143-
144-
impl AsRef<[u8]> for ReceiverToken {
145-
fn as_ref(&self) -> &[u8] { self.0.as_bytes() }
146-
}
147-
148-
impl persist::Value for Receiver {
149-
type Key = ReceiverToken;
150-
151-
fn key(&self) -> Self::Key { ReceiverToken(id(&self.context.s)) }
152-
}
153-
154133
impl Receiver {
155134
/// Loads a [`Receiver`] from the provided persister using the storage token.
156135
pub fn load<P: Persister<Receiver>>(

payjoin/src/receive/v2/persist.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use std::fmt::{self, Display};
2+
3+
use super::{id, Receiver};
4+
use crate::persist::{self};
5+
use crate::uri::ShortId;
6+
7+
/// Opaque key type for the receiver
8+
#[derive(Debug, Clone, PartialEq, Eq)]
9+
pub struct ReceiverToken(ShortId);
10+
11+
impl Display for ReceiverToken {
12+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
13+
}
14+
15+
impl From<Receiver> for ReceiverToken {
16+
fn from(receiver: Receiver) -> Self { ReceiverToken(id(&receiver.context.s)) }
17+
}
18+
19+
impl AsRef<[u8]> for ReceiverToken {
20+
fn as_ref(&self) -> &[u8] { self.0.as_bytes() }
21+
}
22+
23+
impl persist::Value for Receiver {
24+
type Key = ReceiverToken;
25+
26+
fn key(&self) -> Self::Key { ReceiverToken(id(&self.context.s)) }
27+
}

payjoin/src/send/multiparty/mod.rs

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::fmt::{self, Display};
2-
31
use bitcoin::{FeeRate, Psbt};
42
use error::{
53
CreateRequestError, FinalizeResponseError, FinalizedError, InternalCreateRequestError,
@@ -13,12 +11,12 @@ use super::{serialize_url, AdditionalFeeContribution, BuildSenderError, Internal
1311
use crate::hpke::decrypt_message_b;
1412
use crate::ohttp::ohttp_decapsulate;
1513
use crate::output_substitution::OutputSubstitution;
16-
use crate::persist::{self, Persister};
1714
use crate::send::v2::{ImplementationError, V2PostContext};
1815
use crate::uri::UrlExt;
1916
use crate::{PjUri, Request};
2017

2118
mod error;
19+
mod persist;
2220

2321
#[derive(Clone)]
2422
pub struct SenderBuilder<'a>(v2::SenderBuilder<'a>);
@@ -34,49 +32,10 @@ impl<'a> SenderBuilder<'a> {
3432

3533
pub struct NewSender(v2::NewSender);
3634

37-
impl NewSender {
38-
pub fn persist<P: Persister<Sender>>(
39-
&self,
40-
persister: &mut P,
41-
) -> Result<P::Token, ImplementationError> {
42-
let sender =
43-
Sender(v2::Sender { v1: self.0.v1.clone(), reply_key: self.0.reply_key.clone() });
44-
persister.save(sender).map_err(ImplementationError::from)
45-
}
46-
}
47-
48-
#[derive(Clone, Debug, PartialEq, Eq)]
49-
pub struct SenderToken(Url);
50-
51-
impl Display for SenderToken {
52-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
53-
}
54-
55-
impl From<Sender> for SenderToken {
56-
fn from(sender: Sender) -> Self { SenderToken(sender.0.endpoint().clone()) }
57-
}
58-
59-
impl AsRef<[u8]> for SenderToken {
60-
fn as_ref(&self) -> &[u8] { self.0.as_str().as_bytes() }
61-
}
62-
6335
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
6436
pub struct Sender(v2::Sender);
6537

66-
impl persist::Value for Sender {
67-
type Key = SenderToken;
68-
69-
fn key(&self) -> Self::Key { SenderToken(self.0.endpoint().clone()) }
70-
}
71-
7238
impl Sender {
73-
pub fn load<P: Persister<Sender>>(
74-
token: P::Token,
75-
persister: &P,
76-
) -> Result<Self, ImplementationError> {
77-
let sender = persister.load(token).map_err(ImplementationError::from)?;
78-
Ok(sender)
79-
}
8039
pub fn extract_v2(
8140
&self,
8241
ohttp_relay: Url,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use std::fmt::{self, Display};
2+
3+
use url::Url;
4+
5+
use crate::persist::{self, Persister};
6+
use crate::send::multiparty::{ImplementationError, NewSender, Sender};
7+
use crate::send::v2;
8+
9+
impl NewSender {
10+
pub fn persist<P: Persister<Sender>>(
11+
&self,
12+
persister: &mut P,
13+
) -> Result<P::Token, ImplementationError> {
14+
let sender =
15+
Sender(v2::Sender { v1: self.0.v1.clone(), reply_key: self.0.reply_key.clone() });
16+
persister.save(sender).map_err(ImplementationError::from)
17+
}
18+
}
19+
20+
#[derive(Clone, Debug, PartialEq, Eq)]
21+
pub struct SenderToken(Url);
22+
23+
impl Display for SenderToken {
24+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
25+
}
26+
27+
impl From<Sender> for SenderToken {
28+
fn from(sender: Sender) -> Self { SenderToken(sender.0.endpoint().clone()) }
29+
}
30+
31+
impl AsRef<[u8]> for SenderToken {
32+
fn as_ref(&self) -> &[u8] { self.0.as_str().as_bytes() }
33+
}
34+
35+
impl persist::Value for Sender {
36+
type Key = SenderToken;
37+
38+
fn key(&self) -> Self::Key { SenderToken(self.0.endpoint().clone()) }
39+
}
40+
41+
impl Sender {
42+
pub fn load<P: Persister<Sender>>(
43+
token: P::Token,
44+
persister: &P,
45+
) -> Result<Self, ImplementationError> {
46+
let sender = persister.load(token).map_err(ImplementationError::from)?;
47+
Ok(sender)
48+
}
49+
}

payjoin/src/send/v2/mod.rs

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,25 @@
2121
//! [`bitmask-core`](https://github.com/diba-io/bitmask-core) BDK integration. Bring your own
2222
//! wallet and http client.
2323
24-
use std::fmt::{self, Display};
25-
2624
use bitcoin::hashes::{sha256, Hash};
2725
pub use error::{CreateRequestError, EncapsulationError, ImplementationError};
2826
use error::{InternalCreateRequestError, InternalEncapsulationError};
2927
use ohttp::ClientResponse;
28+
pub use persist::SenderToken;
3029
use serde::{Deserialize, Serialize};
3130
use url::Url;
3231

3332
use super::error::BuildSenderError;
3433
use super::*;
3534
use crate::hpke::{decrypt_message_b, encrypt_message_a, HpkeSecretKey};
3635
use crate::ohttp::{ohttp_decapsulate, ohttp_encapsulate};
37-
use crate::persist::{Persister, Value};
36+
use crate::persist::Persister;
3837
use crate::send::v1;
3938
use crate::uri::{ShortId, UrlExt};
4039
use crate::{HpkeKeyPair, HpkePublicKey, IntoUrl, OhttpKeys, PjUri, Request};
4140

4241
mod error;
42+
mod persist;
4343

4444
/// A builder to construct the properties of a [`Sender`].
4545
#[derive(Clone)]
@@ -152,28 +152,6 @@ pub struct Sender {
152152
pub(crate) reply_key: HpkeSecretKey,
153153
}
154154

155-
/// Opaque key type for the sender
156-
#[derive(Debug, Clone, PartialEq, Eq)]
157-
pub struct SenderToken(Url);
158-
159-
impl Display for SenderToken {
160-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
161-
}
162-
163-
impl From<Sender> for SenderToken {
164-
fn from(sender: Sender) -> Self { SenderToken(sender.endpoint().clone()) }
165-
}
166-
167-
impl AsRef<[u8]> for SenderToken {
168-
fn as_ref(&self) -> &[u8] { self.0.as_str().as_bytes() }
169-
}
170-
171-
impl Value for Sender {
172-
type Key = SenderToken;
173-
174-
fn key(&self) -> Self::Key { SenderToken(self.endpoint().clone()) }
175-
}
176-
177155
impl Sender {
178156
/// Loads a [`Sender`] from the provided persister using the storage token.
179157
pub fn load<P: Persister<Sender>>(

payjoin/src/send/v2/persist.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use std::fmt::{self, Display};
2+
3+
use url::Url;
4+
5+
use super::Sender;
6+
use crate::persist::Value;
7+
8+
/// Opaque key type for the sender
9+
#[derive(Debug, Clone, PartialEq, Eq)]
10+
pub struct SenderToken(Url);
11+
12+
impl Display for SenderToken {
13+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", self.0) }
14+
}
15+
16+
impl From<Sender> for SenderToken {
17+
fn from(sender: Sender) -> Self { SenderToken(sender.endpoint().clone()) }
18+
}
19+
20+
impl AsRef<[u8]> for SenderToken {
21+
fn as_ref(&self) -> &[u8] { self.0.as_str().as_bytes() }
22+
}
23+
24+
impl Value for Sender {
25+
type Key = SenderToken;
26+
27+
fn key(&self) -> Self::Key { SenderToken(self.endpoint().clone()) }
28+
}

0 commit comments

Comments
 (0)