1+ use std:: collections:: HashMap ;
2+
3+ use crate :: error:: MutinyError ;
4+ use crate :: storage:: MutinyStorage ;
5+ use hex_conservative:: DisplayHex ;
16use once_cell:: sync:: Lazy ;
7+ use payjoin:: receive:: v2:: Enrolled ;
28use payjoin:: OhttpKeys ;
39use url:: Url ;
410
@@ -11,6 +17,34 @@ pub(crate) static OHTTP_RELAYS: [Lazy<Url>; 3] = [
1117pub ( crate ) static PAYJOIN_DIR : Lazy < Url > =
1218 Lazy :: new ( || Url :: parse ( "https://payjo.in" ) . expect ( "Invalid URL" ) ) ;
1319
20+ pub trait PayjoinStorage {
21+ fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Enrolled > , MutinyError > ;
22+ fn get_payjoins ( & self ) -> Result < Vec < Enrolled > , MutinyError > ;
23+ fn persist_payjoin ( & self , session : Enrolled ) -> Result < ( ) , MutinyError > ;
24+ }
25+
26+ const PAYJOIN_KEY_PREFIX : & str = "payjoin/" ;
27+
28+ fn get_payjoin_key ( id : & [ u8 ; 33 ] ) -> String {
29+ format ! ( "{PAYJOIN_KEY_PREFIX}{}" , id. as_hex( ) )
30+ }
31+
32+ impl < S : MutinyStorage > PayjoinStorage for S {
33+ fn get_payjoin ( & self , id : & [ u8 ; 33 ] ) -> Result < Option < Enrolled > , MutinyError > {
34+ let sessions = self . get_data ( get_payjoin_key ( id) ) ?;
35+ Ok ( sessions)
36+ }
37+
38+ fn get_payjoins ( & self ) -> Result < Vec < Enrolled > , MutinyError > {
39+ let map: HashMap < String , Enrolled > = self . scan ( PAYJOIN_KEY_PREFIX , None ) ?;
40+ Ok ( map. values ( ) . map ( |v| v. to_owned ( ) ) . collect ( ) )
41+ }
42+
43+ fn persist_payjoin ( & self , session : Enrolled ) -> Result < ( ) , MutinyError > {
44+ self . set_data ( get_payjoin_key ( & session. pubkey ( ) ) , session, None )
45+ }
46+ }
47+
1448pub async fn fetch_ohttp_keys (
1549 _ohttp_relay : Url ,
1650 directory : Url ,
0 commit comments