@@ -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,9 +177,21 @@ 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 >
181
- where
188
+ pub struct InvoicePayerUsingTime <
189
+ P : Deref ,
190
+ R : ScoringRouter ,
191
+ L : Deref ,
192
+ E : sealed:: BaseEventHandler ,
193
+ T : Time
194
+ > where
182
195
P :: Target : Payer ,
183
196
L :: Target : Logger ,
184
197
{
@@ -342,7 +355,8 @@ pub enum PaymentError {
342
355
Sending ( PaymentSendFailure ) ,
343
356
}
344
357
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 >
346
360
where
347
361
P :: Target : Payer ,
348
362
L :: Target : Logger ,
@@ -744,12 +758,15 @@ fn has_expired(route_params: &RouteParameters) -> bool {
744
758
} else { false }
745
759
}
746
760
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 >
748
763
where
749
764
P :: Target : Payer ,
750
765
L :: Target : Logger ,
751
766
{
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 {
753
770
match event {
754
771
Event :: PaymentPathFailed { payment_hash, path, .. }
755
772
| Event :: PaymentPathSuccessful { path, payment_hash : Some ( payment_hash) , .. }
@@ -779,7 +796,7 @@ where
779
796
self . payer . abandon_payment ( payment_id. unwrap ( ) ) ;
780
797
} else if self . retry_payment ( payment_id. unwrap ( ) , * payment_hash, retry. as_ref ( ) . unwrap ( ) ) . is_ok ( ) {
781
798
// We retried at least somewhat, don't provide the PaymentPathFailed event to the user.
782
- return ;
799
+ return false ;
783
800
} else {
784
801
self . payer . abandon_payment ( payment_id. unwrap ( ) ) ;
785
802
}
@@ -814,7 +831,37 @@ where
814
831
}
815
832
816
833
// 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
+ }
818
865
}
819
866
}
820
867
@@ -913,7 +960,7 @@ mod tests {
913
960
#[ test]
914
961
fn pays_invoice_on_first_attempt ( ) {
915
962
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 ; } ;
917
964
918
965
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
919
966
let invoice = invoice ( payment_preimage) ;
@@ -939,7 +986,7 @@ mod tests {
939
986
#[ test]
940
987
fn pays_invoice_on_retry ( ) {
941
988
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 ; } ;
943
990
944
991
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
945
992
let invoice = invoice ( payment_preimage) ;
@@ -980,7 +1027,7 @@ mod tests {
980
1027
981
1028
#[ test]
982
1029
fn pays_invoice_on_partial_failure ( ) {
983
- let event_handler = |_: & _ | { panic ! ( ) } ;
1030
+ let event_handler = |_: & Event | { panic ! ( ) } ;
984
1031
985
1032
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
986
1033
let invoice = invoice ( payment_preimage) ;
@@ -1004,7 +1051,7 @@ mod tests {
1004
1051
#[ test]
1005
1052
fn retries_payment_path_for_unknown_payment ( ) {
1006
1053
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 ; } ;
1008
1055
1009
1056
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1010
1057
let invoice = invoice ( payment_preimage) ;
@@ -1048,7 +1095,7 @@ mod tests {
1048
1095
#[ test]
1049
1096
fn fails_paying_invoice_after_max_retry_counts ( ) {
1050
1097
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 ; } ;
1052
1099
1053
1100
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1054
1101
let invoice = invoice ( payment_preimage) ;
@@ -1105,7 +1152,7 @@ mod tests {
1105
1152
#[ test]
1106
1153
fn fails_paying_invoice_after_max_retry_timeout ( ) {
1107
1154
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 ; } ;
1109
1156
1110
1157
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1111
1158
let invoice = invoice ( payment_preimage) ;
@@ -1149,7 +1196,7 @@ mod tests {
1149
1196
#[ test]
1150
1197
fn fails_paying_invoice_with_missing_retry_params ( ) {
1151
1198
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 ; } ;
1153
1200
1154
1201
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1155
1202
let invoice = invoice ( payment_preimage) ;
@@ -1184,7 +1231,7 @@ mod tests {
1184
1231
#[ test]
1185
1232
fn fails_paying_invoice_after_expiration ( ) {
1186
1233
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 ; } ;
1188
1235
1189
1236
let payer = TestPayer :: new ( ) ;
1190
1237
let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
@@ -1204,7 +1251,7 @@ mod tests {
1204
1251
#[ test]
1205
1252
fn fails_retrying_invoice_after_expiration ( ) {
1206
1253
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 ; } ;
1208
1255
1209
1256
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1210
1257
let invoice = invoice ( payment_preimage) ;
@@ -1241,7 +1288,7 @@ mod tests {
1241
1288
#[ test]
1242
1289
fn fails_paying_invoice_after_retry_error ( ) {
1243
1290
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 ; } ;
1245
1292
1246
1293
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1247
1294
let invoice = invoice ( payment_preimage) ;
@@ -1277,7 +1324,7 @@ mod tests {
1277
1324
#[ test]
1278
1325
fn fails_paying_invoice_after_rejected_by_payee ( ) {
1279
1326
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 ; } ;
1281
1328
1282
1329
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1283
1330
let invoice = invoice ( payment_preimage) ;
@@ -1310,7 +1357,7 @@ mod tests {
1310
1357
#[ test]
1311
1358
fn fails_repaying_invoice_with_pending_payment ( ) {
1312
1359
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 ; } ;
1314
1361
1315
1362
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1316
1363
let invoice = invoice ( payment_preimage) ;
@@ -1360,7 +1407,7 @@ mod tests {
1360
1407
let router = FailingRouter { } ;
1361
1408
let logger = TestLogger :: new ( ) ;
1362
1409
let invoice_payer =
1363
- InvoicePayer :: new ( & payer, router, & logger, |_: & _ | { } , Retry :: Attempts ( 0 ) ) ;
1410
+ InvoicePayer :: new ( & payer, router, & logger, |_: & Event | { } , Retry :: Attempts ( 0 ) ) ;
1364
1411
1365
1412
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1366
1413
let invoice = invoice ( payment_preimage) ;
@@ -1383,7 +1430,7 @@ mod tests {
1383
1430
let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
1384
1431
let logger = TestLogger :: new ( ) ;
1385
1432
let invoice_payer =
1386
- InvoicePayer :: new ( & payer, router, & logger, |_: & _ | { } , Retry :: Attempts ( 0 ) ) ;
1433
+ InvoicePayer :: new ( & payer, router, & logger, |_: & Event | { } , Retry :: Attempts ( 0 ) ) ;
1387
1434
1388
1435
match invoice_payer. pay_invoice ( & invoice) {
1389
1436
Err ( PaymentError :: Sending ( _) ) => { } ,
@@ -1395,7 +1442,7 @@ mod tests {
1395
1442
#[ test]
1396
1443
fn pays_zero_value_invoice_using_amount ( ) {
1397
1444
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 ; } ;
1399
1446
1400
1447
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1401
1448
let invoice = zero_value_invoice ( payment_preimage) ;
@@ -1422,7 +1469,7 @@ mod tests {
1422
1469
#[ test]
1423
1470
fn fails_paying_zero_value_invoice_with_amount ( ) {
1424
1471
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 ; } ;
1426
1473
1427
1474
let payer = TestPayer :: new ( ) ;
1428
1475
let router = TestRouter :: new ( TestScorer :: new ( ) ) ;
@@ -1444,7 +1491,7 @@ mod tests {
1444
1491
#[ test]
1445
1492
fn pays_pubkey_with_amount ( ) {
1446
1493
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 ; } ;
1448
1495
1449
1496
let pubkey = pubkey ( ) ;
1450
1497
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
@@ -1494,7 +1541,7 @@ mod tests {
1494
1541
#[ test]
1495
1542
fn scores_failed_channel ( ) {
1496
1543
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 ; } ;
1498
1545
1499
1546
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1500
1547
let invoice = invoice ( payment_preimage) ;
@@ -1532,7 +1579,7 @@ mod tests {
1532
1579
#[ test]
1533
1580
fn scores_successful_channels ( ) {
1534
1581
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 ; } ;
1536
1583
1537
1584
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1538
1585
let invoice = invoice ( payment_preimage) ;
@@ -1564,7 +1611,7 @@ mod tests {
1564
1611
#[ test]
1565
1612
fn generates_correct_inflight_map_data ( ) {
1566
1613
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 ; } ;
1568
1615
1569
1616
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1570
1617
let invoice = invoice ( payment_preimage) ;
@@ -1610,7 +1657,7 @@ mod tests {
1610
1657
fn considers_inflight_htlcs_between_invoice_payments_when_path_succeeds ( ) {
1611
1658
// First, let's just send a payment through, but only make sure one of the path completes
1612
1659
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 ; } ;
1614
1661
1615
1662
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1616
1663
let payment_invoice = invoice ( payment_preimage) ;
@@ -1661,7 +1708,7 @@ mod tests {
1661
1708
fn considers_inflight_htlcs_between_retries ( ) {
1662
1709
// First, let's just send a payment through, but only make sure one of the path completes
1663
1710
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 ; } ;
1665
1712
1666
1713
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1667
1714
let payment_invoice = invoice ( payment_preimage) ;
@@ -1732,7 +1779,7 @@ mod tests {
1732
1779
#[ test]
1733
1780
fn accounts_for_some_inflight_htlcs_sent_during_partial_failure ( ) {
1734
1781
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 ; } ;
1736
1783
1737
1784
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1738
1785
let invoice_to_pay = invoice ( payment_preimage) ;
@@ -1763,7 +1810,7 @@ mod tests {
1763
1810
#[ test]
1764
1811
fn accounts_for_all_inflight_htlcs_sent_during_partial_failure ( ) {
1765
1812
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 ; } ;
1767
1814
1768
1815
let payment_preimage = PaymentPreimage ( [ 1 ; 32 ] ) ;
1769
1816
let invoice_to_pay = invoice ( payment_preimage) ;
@@ -2260,7 +2307,7 @@ mod tests {
2260
2307
route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_000 ;
2261
2308
router. expect_find_route ( Ok ( route. clone ( ) ) ) ;
2262
2309
2263
- let event_handler = |_: & _ | { panic ! ( ) ; } ;
2310
+ let event_handler = |_: & Event | { panic ! ( ) ; } ;
2264
2311
let invoice_payer = InvoicePayer :: new ( nodes[ 0 ] . node , router, nodes[ 0 ] . logger , event_handler, Retry :: Attempts ( 1 ) ) ;
2265
2312
2266
2313
assert ! ( invoice_payer. pay_invoice( & create_invoice_from_channelmanager_and_duration_since_epoch(
@@ -2305,7 +2352,7 @@ mod tests {
2305
2352
route. paths [ 1 ] [ 0 ] . fee_msat = 50_000_001 ;
2306
2353
router. expect_find_route ( Ok ( route. clone ( ) ) ) ;
2307
2354
2308
- let event_handler = |_: & _ | { panic ! ( ) ; } ;
2355
+ let event_handler = |_: & Event | { panic ! ( ) ; } ;
2309
2356
let invoice_payer = InvoicePayer :: new ( nodes[ 0 ] . node , router, nodes[ 0 ] . logger , event_handler, Retry :: Attempts ( 1 ) ) ;
2310
2357
2311
2358
assert ! ( invoice_payer. pay_invoice( & create_invoice_from_channelmanager_and_duration_since_epoch(
0 commit comments