@@ -2,7 +2,7 @@ use crate::auth::MutinyAuthClient;
22use crate :: labels:: LabelStorage ;
33use crate :: ldkstorage:: CHANNEL_CLOSURE_PREFIX ;
44use crate :: logging:: LOGGING_KEY ;
5- use crate :: payjoin:: Error as PayjoinError ;
5+ use crate :: payjoin:: { Error as PayjoinError , PayjoinStorage , RecvSession } ;
66use crate :: utils:: { sleep, spawn} ;
77use crate :: MutinyInvoice ;
88use crate :: MutinyWalletConfig ;
@@ -578,6 +578,14 @@ impl<S: MutinyStorage> NodeManager<S> {
578578 Ok ( ( ) )
579579 }
580580
581+ /// Starts a background task to poll payjoin sessions to attempt receiving.
582+ pub ( crate ) fn resume_payjoins ( nm : Arc < NodeManager < S > > ) {
583+ let all = nm. storage . list_recv_sessions ( ) . unwrap_or_default ( ) ;
584+ for payjoin in all {
585+ nm. clone ( ) . spawn_payjoin_receiver ( payjoin) ;
586+ }
587+ }
588+
581589 /// Creates a background process that will sync the wallet with the blockchain.
582590 /// This will also update the fee estimates every 10 minutes.
583591 pub fn start_sync ( nm : Arc < NodeManager < S > > ) {
@@ -769,12 +777,13 @@ impl<S: MutinyStorage> NodeManager<S> {
769777 Ok ( txid)
770778 }
771779
772- pub fn spawn_payjoin_receiver ( & self , enrolled : Enrolled ) {
780+ pub fn spawn_payjoin_receiver ( & self , session : RecvSession ) {
773781 let logger = self . logger . clone ( ) ;
774782 let stop = self . stop . clone ( ) ;
783+ let storage = Arc :: new ( self . storage . clone ( ) ) ;
775784 let wallet = self . wallet . clone ( ) ;
776785 utils:: spawn ( async move {
777- match Self :: receive_payjoin ( wallet, stop, enrolled ) . await {
786+ match Self :: receive_payjoin ( wallet, stop, storage , session ) . await {
778787 Ok ( txid) => log_info ! ( logger, "Received payjoin txid: {txid}" ) ,
779788 Err ( e) => log_error ! ( logger, "Error receiving payjoin: {e}" ) ,
780789 } ;
@@ -785,13 +794,14 @@ impl<S: MutinyStorage> NodeManager<S> {
785794 async fn receive_payjoin (
786795 wallet : Arc < OnChainWallet < S > > ,
787796 stop : Arc < AtomicBool > ,
788- mut enrolled : payjoin:: receive:: v2:: Enrolled ,
797+ storage : Arc < S > ,
798+ mut session : crate :: payjoin:: RecvSession ,
789799 ) -> Result < Txid , MutinyError > {
790800 let http_client = reqwest:: Client :: builder ( )
791801 . build ( )
792802 . map_err ( PayjoinError :: Reqwest ) ?;
793803 let proposal: payjoin:: receive:: v2:: UncheckedProposal =
794- Self :: poll_for_fallback_psbt ( stop, & http_client, & mut enrolled ) . await ?;
804+ Self :: poll_for_fallback_psbt ( stop, storage , & http_client, & mut session ) . await ?;
795805 let original_tx = proposal. extract_tx_to_schedule_broadcast ( ) ;
796806 let mut payjoin_proposal = match wallet. process_payjoin_proposal ( proposal) {
797807 Ok ( p) => p,
@@ -821,22 +831,30 @@ impl<S: MutinyStorage> NodeManager<S> {
821831
822832 async fn poll_for_fallback_psbt (
823833 stop : Arc < AtomicBool > ,
834+ storage : Arc < S > ,
824835 client : & reqwest:: Client ,
825- enroller : & mut payjoin :: receive :: v2 :: Enrolled ,
836+ session : & mut crate :: payjoin :: RecvSession ,
826837 ) -> Result < payjoin:: receive:: v2:: UncheckedProposal , PayjoinError > {
827838 loop {
828839 if stop. load ( Ordering :: Relaxed ) {
829840 return Err ( crate :: payjoin:: Error :: Shutdown ) ;
830841 }
831- let ( req, context) = enroller. extract_req ( ) ?;
842+
843+ if session. expiry < utils:: now ( ) {
844+ let _ = storage. delete_recv_session ( & session. enrolled . pubkey ( ) ) ;
845+ return Err ( crate :: payjoin:: Error :: SessionExpired ) ;
846+ }
847+ let ( req, context) = session. enrolled . extract_req ( ) ?;
832848 let ohttp_response = client
833849 . post ( req. url )
834850 . header ( "Content-Type" , "message/ohttp-req" )
835851 . body ( req. body )
836852 . send ( )
837853 . await ?;
838854 let ohttp_response = ohttp_response. bytes ( ) . await ?;
839- let proposal = enroller. process_res ( ohttp_response. as_ref ( ) , context) ?;
855+ let proposal = session
856+ . enrolled
857+ . process_res ( ohttp_response. as_ref ( ) , context) ?;
840858 match proposal {
841859 Some ( proposal) => return Ok ( proposal) ,
842860 None => utils:: sleep ( 5000 ) . await ,
0 commit comments