Skip to content

Commit 03406bb

Browse files
committed
Use BaseEventHandler to expose async event handling on InvoicePayer
We introduce a new sealed trait BaseEventHandler that has a blanket implementation for any T. Since the trait cannot be implemented outside of the crate, this allow us to expose specific implementations of InvoicePayer that allow for synchronous and asynchronous event handling.
1 parent d82fd8f commit 03406bb

File tree

1 file changed

+80
-33
lines changed

1 file changed

+80
-33
lines changed

lightning-invoice/src/payment.rs

+80-33
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ use secp256k1::PublicKey;
157157

158158
use core::fmt;
159159
use core::fmt::{Debug, Display, Formatter};
160+
use core::future::Future;
160161
use core::ops::Deref;
161162
use core::time::Duration;
162163
#[cfg(feature = "std")]
@@ -176,9 +177,21 @@ use crate::time_utils;
176177
#[cfg(feature = "no-std")]
177178
type 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>
346360
where
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>
748763
where
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

Comments
 (0)