@@ -157,6 +157,7 @@ use secp256k1::PublicKey;
157157
158158use core:: fmt;
159159use core:: fmt:: { Debug , Display , Formatter } ;
160+ use core:: future:: Future ;
160161use core:: ops:: Deref ;
161162use core:: time:: Duration ;
162163#[ cfg( feature = "std" ) ]
@@ -176,9 +177,21 @@ use crate::time_utils;
176177#[ cfg( feature = "no-std" ) ]
177178type ConfiguredTime = time_utils:: Eternity ;
178179
180+ /// Sealed trait with a blanket implementation to allow both sync and async implementations of event
181+ /// handling to exist within the InvoicePayer.
182+ mod sealed {
183+ pub trait BaseEventHandler { }
184+ impl < T > BaseEventHandler for T { }
185+ }
186+
179187/// (C-not exported) generally all users should use the [`InvoicePayer`] type alias.
180- pub struct InvoicePayerUsingTime < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time >
181- where
188+ pub struct InvoicePayerUsingTime <
189+ P : Deref ,
190+ R : ScoringRouter ,
191+ L : Deref ,
192+ E : sealed:: BaseEventHandler ,
193+ T : Time
194+ > where
182195 P :: Target : Payer ,
183196 L :: Target : Logger ,
184197{
@@ -342,7 +355,8 @@ pub enum PaymentError {
342355 Sending ( PaymentSendFailure ) ,
343356}
344357
345- impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time > InvoicePayerUsingTime < P , R , L , E , T >
358+ impl < P : Deref , R : ScoringRouter , L : Deref , E : sealed:: BaseEventHandler , T : Time >
359+ InvoicePayerUsingTime < P , R , L , E , T >
346360where
347361 P :: Target : Payer ,
348362 L :: Target : Logger ,
@@ -744,12 +758,15 @@ fn has_expired(route_params: &RouteParameters) -> bool {
744758 } else { false }
745759}
746760
747- impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time > EventHandler for InvoicePayerUsingTime < P , R , L , E , T >
761+ impl < P : Deref , R : ScoringRouter , L : Deref , E : sealed:: BaseEventHandler , T : Time >
762+ InvoicePayerUsingTime < P , R , L , E , T >
748763where
749764 P :: Target : Payer ,
750765 L :: Target : Logger ,
751766{
752- fn handle_event ( & self , event : & Event ) {
767+ /// Returns a bool indicating whether the processed event should be forwarded to a user-provided
768+ /// event handler.
769+ fn handle_event_internal ( & self , event : & Event ) -> bool {
753770 match event {
754771 Event :: PaymentPathFailed { payment_hash, path, .. }
755772 | Event :: PaymentPathSuccessful { path, payment_hash : Some ( payment_hash) , .. }
@@ -779,7 +796,7 @@ where
779796 self . payer . abandon_payment ( payment_id. unwrap ( ) ) ;
780797 } else if self . retry_payment ( payment_id. unwrap ( ) , * payment_hash, retry. as_ref ( ) . unwrap ( ) ) . is_ok ( ) {
781798 // We retried at least somewhat, don't provide the PaymentPathFailed event to the user.
782- return ;
799+ return false ;
783800 } else {
784801 self . payer . abandon_payment ( payment_id. unwrap ( ) ) ;
785802 }
@@ -814,7 +831,37 @@ where
814831 }
815832
816833 // Delegate to the decorated event handler unless the payment is retried.
817- self . event_handler . handle_event ( event)
834+ true
835+ }
836+ }
837+
838+ impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time >
839+ EventHandler for InvoicePayerUsingTime < P , R , L , E , T >
840+ where
841+ P :: Target : Payer ,
842+ L :: Target : Logger ,
843+ {
844+ fn handle_event ( & self , event : & Event ) {
845+ let should_forward = self . handle_event_internal ( & event) ;
846+ if should_forward {
847+ self . event_handler . handle_event ( & event)
848+ }
849+ }
850+ }
851+
852+ impl < P : Deref , R : ScoringRouter , L : Deref , T : Time , F : Future , H : Fn ( Event ) -> F >
853+ InvoicePayerUsingTime < P , R , L , H , T >
854+ where
855+ P :: Target : Payer ,
856+ L :: Target : Logger ,
857+ {
858+ /// Intercepts events required by the [`InvoicePayer`] and forwards them to the underlying event
859+ /// handler, if necessary, to handle them asynchronously.
860+ pub async fn handle_event_async ( & self , event : Event ) {
861+ let should_forward = self . handle_event_internal ( & event) ;
862+ if should_forward {
863+ ( self . event_handler ) ( event) . await ;
864+ }
818865 }
819866}
820867
@@ -913,7 +960,7 @@ mod tests {
913960 #[ test]
914961 fn pays_invoice_on_first_attempt ( ) {
915962 let event_handled = core:: cell:: RefCell :: new ( false ) ;
916- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
963+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
917964
918965 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
919966 let invoice = invoice ( payment_preimage) ;
@@ -939,7 +986,7 @@ mod tests {
939986 #[ test]
940987 fn pays_invoice_on_retry ( ) {
941988 let event_handled = core:: cell:: RefCell :: new ( false ) ;
942- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
989+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
943990
944991 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
945992 let invoice = invoice ( payment_preimage) ;
@@ -980,7 +1027,7 @@ mod tests {
9801027
9811028 #[ test]
9821029 fn pays_invoice_on_partial_failure ( ) {
983- let event_handler = |_: & _ | { panic ! ( ) } ;
1030+ let event_handler = |_: & Event | { panic ! ( ) } ;
9841031
9851032 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
9861033 let invoice = invoice ( payment_preimage) ;
@@ -1004,7 +1051,7 @@ mod tests {
10041051 #[ test]
10051052 fn retries_payment_path_for_unknown_payment ( ) {
10061053 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1007- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1054+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
10081055
10091056 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
10101057 let invoice = invoice ( payment_preimage) ;
@@ -1048,7 +1095,7 @@ mod tests {
10481095 #[ test]
10491096 fn fails_paying_invoice_after_max_retry_counts ( ) {
10501097 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1051- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1098+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
10521099
10531100 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
10541101 let invoice = invoice ( payment_preimage) ;
@@ -1105,7 +1152,7 @@ mod tests {
11051152 #[ test]
11061153 fn fails_paying_invoice_after_max_retry_timeout ( ) {
11071154 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1108- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1155+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
11091156
11101157 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
11111158 let invoice = invoice ( payment_preimage) ;
@@ -1149,7 +1196,7 @@ mod tests {
11491196 #[ test]
11501197 fn fails_paying_invoice_with_missing_retry_params ( ) {
11511198 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1152- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1199+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
11531200
11541201 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
11551202 let invoice = invoice ( payment_preimage) ;
@@ -1184,7 +1231,7 @@ mod tests {
11841231 #[ test]
11851232 fn fails_paying_invoice_after_expiration ( ) {
11861233 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1187- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1234+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
11881235
11891236 let payer = TestPayer :: new ( ) ;
11901237 let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
@@ -1204,7 +1251,7 @@ mod tests {
12041251 #[ test]
12051252 fn fails_retrying_invoice_after_expiration ( ) {
12061253 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1207- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1254+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
12081255
12091256 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
12101257 let invoice = invoice ( payment_preimage) ;
@@ -1241,7 +1288,7 @@ mod tests {
12411288 #[ test]
12421289 fn fails_paying_invoice_after_retry_error ( ) {
12431290 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1244- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1291+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
12451292
12461293 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
12471294 let invoice = invoice ( payment_preimage) ;
@@ -1277,7 +1324,7 @@ mod tests {
12771324 #[ test]
12781325 fn fails_paying_invoice_after_rejected_by_payee ( ) {
12791326 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1280- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1327+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
12811328
12821329 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
12831330 let invoice = invoice ( payment_preimage) ;
@@ -1310,7 +1357,7 @@ mod tests {
13101357 #[ test]
13111358 fn fails_repaying_invoice_with_pending_payment ( ) {
13121359 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1313- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1360+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
13141361
13151362 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
13161363 let invoice = invoice ( payment_preimage) ;
@@ -1360,7 +1407,7 @@ mod tests {
13601407 let router = FailingRouter { } ;
13611408 let logger = TestLogger :: new ( ) ;
13621409 let invoice_payer =
1363- InvoicePayer :: new ( & payer, router, & logger, |_: & _ | { } , Retry :: Attempts ( 0 ) ) ;
1410+ InvoicePayer :: new ( & payer, router, & logger, |_: & Event | { } , Retry :: Attempts ( 0 ) ) ;
13641411
13651412 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
13661413 let invoice = invoice ( payment_preimage) ;
@@ -1383,7 +1430,7 @@ mod tests {
13831430 let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
13841431 let logger = TestLogger :: new ( ) ;
13851432 let invoice_payer =
1386- InvoicePayer :: new ( & payer, router, & logger, |_: & _ | { } , Retry :: Attempts ( 0 ) ) ;
1433+ InvoicePayer :: new ( & payer, router, & logger, |_: & Event | { } , Retry :: Attempts ( 0 ) ) ;
13871434
13881435 match invoice_payer. pay_invoice ( & invoice) {
13891436 Err ( PaymentError :: Sending ( _) ) => { } ,
@@ -1395,7 +1442,7 @@ mod tests {
13951442 #[ test]
13961443 fn pays_zero_value_invoice_using_amount ( ) {
13971444 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1398- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1445+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
13991446
14001447 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
14011448 let invoice = zero_value_invoice ( payment_preimage) ;
@@ -1422,7 +1469,7 @@ mod tests {
14221469 #[ test]
14231470 fn fails_paying_zero_value_invoice_with_amount ( ) {
14241471 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1425- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1472+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
14261473
14271474 let payer = TestPayer :: new ( ) ;
14281475 let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
@@ -1444,7 +1491,7 @@ mod tests {
14441491 #[ test]
14451492 fn pays_pubkey_with_amount ( ) {
14461493 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1447- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1494+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
14481495
14491496 let pubkey = pubkey ( ) ;
14501497 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
@@ -1494,7 +1541,7 @@ mod tests {
14941541 #[ test]
14951542 fn scores_failed_channel ( ) {
14961543 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1497- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1544+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
14981545
14991546 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
15001547 let invoice = invoice ( payment_preimage) ;
@@ -1532,7 +1579,7 @@ mod tests {
15321579 #[ test]
15331580 fn scores_successful_channels ( ) {
15341581 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1535- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1582+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
15361583
15371584 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
15381585 let invoice = invoice ( payment_preimage) ;
@@ -1564,7 +1611,7 @@ mod tests {
15641611 #[ test]
15651612 fn generates_correct_inflight_map_data ( ) {
15661613 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1567- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1614+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
15681615
15691616 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
15701617 let invoice = invoice ( payment_preimage) ;
@@ -1610,7 +1657,7 @@ mod tests {
16101657 fn considers_inflight_htlcs_between_invoice_payments_when_path_succeeds ( ) {
16111658 // First, let's just send a payment through, but only make sure one of the path completes
16121659 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1613- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1660+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
16141661
16151662 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
16161663 let payment_invoice = invoice ( payment_preimage) ;
@@ -1661,7 +1708,7 @@ mod tests {
16611708 fn considers_inflight_htlcs_between_retries ( ) {
16621709 // First, let's just send a payment through, but only make sure one of the path completes
16631710 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1664- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1711+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
16651712
16661713 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
16671714 let payment_invoice = invoice ( payment_preimage) ;
@@ -1732,7 +1779,7 @@ mod tests {
17321779 #[ test]
17331780 fn accounts_for_some_inflight_htlcs_sent_during_partial_failure ( ) {
17341781 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1735- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1782+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
17361783
17371784 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
17381785 let invoice_to_pay = invoice ( payment_preimage) ;
@@ -1763,7 +1810,7 @@ mod tests {
17631810 #[ test]
17641811 fn accounts_for_all_inflight_htlcs_sent_during_partial_failure ( ) {
17651812 let event_handled = core:: cell:: RefCell :: new ( false ) ;
1766- let event_handler = |_: & _ | { * event_handled. borrow_mut ( ) = true ; } ;
1813+ let event_handler = |_: & Event | { * event_handled. borrow_mut ( ) = true ; } ;
17671814
17681815 let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
17691816 let invoice_to_pay = invoice ( payment_preimage) ;
@@ -2260,7 +2307,7 @@ mod tests {
22602307 route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_000 ;
22612308 router. expect_find_route ( Ok ( route. clone ( ) ) ) ;
22622309
2263- let event_handler = |_: & _ | { panic ! ( ) ; } ;
2310+ let event_handler = |_: & Event | { panic ! ( ) ; } ;
22642311 let invoice_payer = InvoicePayer :: new ( nodes[ 0 ] . node , router, nodes[ 0 ] . logger , event_handler, Retry :: Attempts ( 1 ) ) ;
22652312
22662313 assert ! ( invoice_payer. pay_invoice( & create_invoice_from_channelmanager_and_duration_since_epoch(
@@ -2305,7 +2352,7 @@ mod tests {
23052352 route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_001 ;
23062353 router. expect_find_route ( Ok ( route. clone ( ) ) ) ;
23072354
2308- let event_handler = |_: & _ | { panic ! ( ) ; } ;
2355+ let event_handler = |_: & Event | { panic ! ( ) ; } ;
23092356 let invoice_payer = InvoicePayer :: new ( nodes[ 0 ] . node , router, nodes[ 0 ] . logger , event_handler, Retry :: Attempts ( 1 ) ) ;
23102357
23112358 assert ! ( invoice_payer. pay_invoice( & create_invoice_from_channelmanager_and_duration_since_epoch(
0 commit comments