@@ -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 ;
@@ -581,6 +581,14 @@ impl<S: MutinyStorage> NodeManager<S> {
581581 Ok ( ( ) )
582582 }
583583
584+ /// Starts a background task to poll payjoin sessions to attempt receiving.
585+ pub ( crate ) fn resume_payjoins ( nm : Arc < NodeManager < S > > ) {
586+ let all = nm. storage . list_recv_sessions ( ) . unwrap_or_default ( ) ;
587+ for payjoin in all {
588+ nm. clone ( ) . spawn_payjoin_receiver ( payjoin) ;
589+ }
590+ }
591+
584592 /// Creates a background process that will sync the wallet with the blockchain.
585593 /// This will also update the fee estimates every 10 minutes.
586594 pub fn start_sync ( nm : Arc < NodeManager < S > > ) {
@@ -772,12 +780,13 @@ impl<S: MutinyStorage> NodeManager<S> {
772780 Ok ( txid)
773781 }
774782
775- pub fn spawn_payjoin_receiver ( & self , enrolled : Enrolled ) {
783+ pub fn spawn_payjoin_receiver ( & self , session : RecvSession ) {
776784 let logger = self . logger . clone ( ) ;
777785 let stop = self . stop . clone ( ) ;
786+ let storage = Arc :: new ( self . storage . clone ( ) ) ;
778787 let wallet = self . wallet . clone ( ) ;
779788 utils:: spawn ( async move {
780- match Self :: receive_payjoin ( wallet, stop, enrolled ) . await {
789+ match Self :: receive_payjoin ( wallet, stop, storage , session ) . await {
781790 Ok ( txid) => log_info ! ( logger, "Received payjoin txid: {txid}" ) ,
782791 Err ( e) => log_error ! ( logger, "Error receiving payjoin: {e}" ) ,
783792 } ;
@@ -788,13 +797,14 @@ impl<S: MutinyStorage> NodeManager<S> {
788797 async fn receive_payjoin (
789798 wallet : Arc < OnChainWallet < S > > ,
790799 stop : Arc < AtomicBool > ,
791- mut enrolled : payjoin:: receive:: v2:: Enrolled ,
800+ storage : Arc < S > ,
801+ mut session : crate :: payjoin:: RecvSession ,
792802 ) -> Result < Txid , MutinyError > {
793803 let http_client = reqwest:: Client :: builder ( )
794804 . build ( )
795805 . map_err ( PayjoinError :: Reqwest ) ?;
796806 let proposal: payjoin:: receive:: v2:: UncheckedProposal =
797- Self :: poll_for_fallback_psbt ( stop, & http_client, & mut enrolled ) . await ?;
807+ Self :: poll_for_fallback_psbt ( stop, storage , & http_client, & mut session ) . await ?;
798808 let original_tx = proposal. extract_tx_to_schedule_broadcast ( ) ;
799809 let mut payjoin_proposal = match wallet
800810 . process_payjoin_proposal ( proposal)
@@ -827,22 +837,30 @@ impl<S: MutinyStorage> NodeManager<S> {
827837
828838 async fn poll_for_fallback_psbt (
829839 stop : Arc < AtomicBool > ,
840+ storage : Arc < S > ,
830841 client : & reqwest:: Client ,
831- enroller : & mut payjoin :: receive :: v2 :: Enrolled ,
842+ session : & mut crate :: payjoin :: RecvSession ,
832843 ) -> Result < payjoin:: receive:: v2:: UncheckedProposal , PayjoinError > {
833844 loop {
834845 if stop. load ( Ordering :: Relaxed ) {
835846 return Err ( crate :: payjoin:: Error :: Shutdown ) ;
836847 }
837- let ( req, context) = enroller. extract_req ( ) ?;
848+
849+ if session. expiry < utils:: now ( ) {
850+ let _ = storage. delete_recv_session ( & session. enrolled . pubkey ( ) ) ;
851+ return Err ( crate :: payjoin:: Error :: SessionExpired ) ;
852+ }
853+ let ( req, context) = session. enrolled . extract_req ( ) ?;
838854 let ohttp_response = client
839855 . post ( req. url )
840856 . header ( "Content-Type" , "message/ohttp-req" )
841857 . body ( req. body )
842858 . send ( )
843859 . await ?;
844860 let ohttp_response = ohttp_response. bytes ( ) . await ?;
845- let proposal = enroller. process_res ( ohttp_response. as_ref ( ) , context) ?;
861+ let proposal = session
862+ . enrolled
863+ . process_res ( ohttp_response. as_ref ( ) , context) ?;
846864 match proposal {
847865 Some ( proposal) => return Ok ( proposal) ,
848866 None => utils:: sleep ( 5000 ) . await ,
0 commit comments