@@ -157,6 +157,7 @@ use secp256k1::PublicKey;
157
157
158
158
use core:: fmt;
159
159
use core:: fmt:: { Debug , Display , Formatter } ;
160
+ use core:: future:: Future ;
160
161
use core:: ops:: Deref ;
161
162
use core:: time:: Duration ;
162
163
#[ cfg( feature = "std" ) ]
@@ -176,8 +177,15 @@ use crate::time_utils;
176
177
#[ cfg( feature = "no-std" ) ]
177
178
type ConfiguredTime = time_utils:: Eternity ;
178
179
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
+
179
187
/// (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 >
188
+ pub struct InvoicePayerUsingTime < P : Deref , R : ScoringRouter , L : Deref , E : sealed :: BaseEventHandler , T : Time >
181
189
where
182
190
P :: Target : Payer ,
183
191
L :: Target : Logger ,
@@ -342,7 +350,7 @@ pub enum PaymentError {
342
350
Sending ( PaymentSendFailure ) ,
343
351
}
344
352
345
- impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time > InvoicePayerUsingTime < P , R , L , E , T >
353
+ impl < P : Deref , R : ScoringRouter , L : Deref , E : sealed :: BaseEventHandler , T : Time > InvoicePayerUsingTime < P , R , L , E , T >
346
354
where
347
355
P :: Target : Payer ,
348
356
L :: Target : Logger ,
@@ -744,12 +752,12 @@ fn has_expired(route_params: &RouteParameters) -> bool {
744
752
} else { false }
745
753
}
746
754
747
- impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time > EventHandler for InvoicePayerUsingTime < P , R , L , E , T >
755
+ impl < P : Deref , R : ScoringRouter , L : Deref , E : sealed :: BaseEventHandler , T : Time > InvoicePayerUsingTime < P , R , L , E , T >
748
756
where
749
757
P :: Target : Payer ,
750
758
L :: Target : Logger ,
751
759
{
752
- fn handle_event ( & self , event : Event ) {
760
+ fn handle_event_internal ( & self , event : Event ) -> Option < Event > {
753
761
match event {
754
762
Event :: PaymentPathFailed { payment_hash, ref path, .. }
755
763
| Event :: PaymentPathSuccessful { ref path, payment_hash : Some ( payment_hash) , .. }
@@ -779,7 +787,7 @@ where
779
787
self . payer . abandon_payment ( payment_id. unwrap ( ) ) ;
780
788
} else if self . retry_payment ( payment_id. unwrap ( ) , payment_hash, retry. as_ref ( ) . unwrap ( ) ) . is_ok ( ) {
781
789
// We retried at least somewhat, don't provide the PaymentPathFailed event to the user.
782
- return ;
790
+ return None ;
783
791
} else {
784
792
self . payer . abandon_payment ( payment_id. unwrap ( ) ) ;
785
793
}
@@ -814,7 +822,35 @@ where
814
822
}
815
823
816
824
// Delegate to the decorated event handler unless the payment is retried.
817
- self . event_handler . handle_event ( event)
825
+ Some ( event)
826
+ }
827
+ }
828
+
829
+ impl < P : Deref , R : ScoringRouter , L : Deref , E : EventHandler , T : Time >
830
+ EventHandler for InvoicePayerUsingTime < P , R , L , E , T >
831
+ where
832
+ P :: Target : Payer ,
833
+ L :: Target : Logger ,
834
+ {
835
+ fn handle_event ( & self , event : Event ) {
836
+ if let Some ( event) = self . handle_event_internal ( event) {
837
+ self . event_handler . handle_event ( event)
838
+ }
839
+ }
840
+ }
841
+
842
+ impl < P : Deref , R : ScoringRouter , L : Deref , T : Time , F : Future , H : Fn ( Event ) -> F >
843
+ InvoicePayerUsingTime < P , R , L , H , T >
844
+ where
845
+ P :: Target : Payer ,
846
+ L :: Target : Logger ,
847
+ {
848
+ /// Intercepts events required by the [`InvoicePayer`] and forwards them to the underlying event
849
+ /// handler, if necessary, to handle them asynchronously.
850
+ pub async fn handle_event_async ( & self , event : Event ) {
851
+ if let Some ( event) = self . handle_event_internal ( event) {
852
+ ( self . event_handler ) ( event) . await ;
853
+ }
818
854
}
819
855
}
820
856
@@ -980,7 +1016,7 @@ mod tests {
980
1016
981
1017
#[ test]
982
1018
fn pays_invoice_on_partial_failure ( ) {
983
- let event_handler = |_: _ | { panic ! ( ) } ;
1019
+ let event_handler = |_: Event | { panic ! ( ) } ;
984
1020
985
1021
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
986
1022
let invoice = invoice ( payment_preimage) ;
@@ -1184,7 +1220,7 @@ mod tests {
1184
1220
#[ test]
1185
1221
fn fails_paying_invoice_after_expiration ( ) {
1186
1222
let event_handled = core:: cell:: RefCell :: new ( false ) ;
1187
- let event_handler = |_: _ | { * event_handled. borrow_mut ( ) = true ; } ;
1223
+ let event_handler = |_: Event | { * event_handled. borrow_mut ( ) = true ; } ;
1188
1224
1189
1225
let payer = TestPayer :: new ( ) ;
1190
1226
let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
@@ -1360,7 +1396,7 @@ mod tests {
1360
1396
let router = FailingRouter { } ;
1361
1397
let logger = TestLogger :: new ( ) ;
1362
1398
let invoice_payer =
1363
- InvoicePayer :: new ( & payer, router, & logger, |_: _ | { } , Retry :: Attempts ( 0 ) ) ;
1399
+ InvoicePayer :: new ( & payer, router, & logger, |_: Event | { } , Retry :: Attempts ( 0 ) ) ;
1364
1400
1365
1401
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1366
1402
let invoice = invoice ( payment_preimage) ;
@@ -1383,7 +1419,7 @@ mod tests {
1383
1419
let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
1384
1420
let logger = TestLogger :: new ( ) ;
1385
1421
let invoice_payer =
1386
- InvoicePayer :: new ( & payer, router, & logger, |_: _ | { } , Retry :: Attempts ( 0 ) ) ;
1422
+ InvoicePayer :: new ( & payer, router, & logger, |_: Event | { } , Retry :: Attempts ( 0 ) ) ;
1387
1423
1388
1424
match invoice_payer. pay_invoice ( & invoice) {
1389
1425
Err ( PaymentError :: Sending ( _) ) => { } ,
@@ -1422,7 +1458,7 @@ mod tests {
1422
1458
#[ test]
1423
1459
fn fails_paying_zero_value_invoice_with_amount ( ) {
1424
1460
let event_handled = core:: cell:: RefCell :: new ( false ) ;
1425
- let event_handler = |_: _ | { * event_handled. borrow_mut ( ) = true ; } ;
1461
+ let event_handler = |_: Event | { * event_handled. borrow_mut ( ) = true ; } ;
1426
1462
1427
1463
let payer = TestPayer :: new ( ) ;
1428
1464
let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
@@ -1732,7 +1768,7 @@ mod tests {
1732
1768
#[ test]
1733
1769
fn accounts_for_some_inflight_htlcs_sent_during_partial_failure ( ) {
1734
1770
let event_handled = core:: cell:: RefCell :: new ( false ) ;
1735
- let event_handler = |_: _ | { * event_handled. borrow_mut ( ) = true ; } ;
1771
+ let event_handler = |_: Event | { * event_handled. borrow_mut ( ) = true ; } ;
1736
1772
1737
1773
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1738
1774
let invoice_to_pay = invoice ( payment_preimage) ;
@@ -1763,7 +1799,7 @@ mod tests {
1763
1799
#[ test]
1764
1800
fn accounts_for_all_inflight_htlcs_sent_during_partial_failure ( ) {
1765
1801
let event_handled = core:: cell:: RefCell :: new ( false ) ;
1766
- let event_handler = |_: _ | { * event_handled. borrow_mut ( ) = true ; } ;
1802
+ let event_handler = |_: Event | { * event_handled. borrow_mut ( ) = true ; } ;
1767
1803
1768
1804
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1769
1805
let invoice_to_pay = invoice ( payment_preimage) ;
@@ -2260,7 +2296,7 @@ mod tests {
2260
2296
route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_000 ;
2261
2297
router. expect_find_route ( Ok ( route. clone ( ) ) ) ;
2262
2298
2263
- let event_handler = |_: _ | { panic ! ( ) ; } ;
2299
+ let event_handler = |_: Event | { panic ! ( ) ; } ;
2264
2300
let invoice_payer = InvoicePayer :: new ( nodes[ 0 ] . node , router, nodes[ 0 ] . logger , event_handler, Retry :: Attempts ( 1 ) ) ;
2265
2301
2266
2302
assert ! ( invoice_payer. pay_invoice( & create_invoice_from_channelmanager_and_duration_since_epoch(
@@ -2305,7 +2341,7 @@ mod tests {
2305
2341
route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_001 ;
2306
2342
router. expect_find_route ( Ok ( route. clone ( ) ) ) ;
2307
2343
2308
- let event_handler = |_: _ | { panic ! ( ) ; } ;
2344
+ let event_handler = |_: Event | { panic ! ( ) ; } ;
2309
2345
let invoice_payer = InvoicePayer :: new ( nodes[ 0 ] . node , router, nodes[ 0 ] . logger , event_handler, Retry :: Attempts ( 1 ) ) ;
2310
2346
2311
2347
assert ! ( invoice_payer. pay_invoice( & create_invoice_from_channelmanager_and_duration_since_epoch(
0 commit comments