@@ -16,8 +16,12 @@ use core::ops::Deref;
16
16
use core:: sync:: atomic:: { AtomicUsize , Ordering } ;
17
17
18
18
use crate :: events:: EventQueue ;
19
+
20
+ #[ cfg( feature = "time" ) ]
21
+ use crate :: lsps0:: ser:: DefaultTimeProvider ;
22
+
19
23
use crate :: lsps0:: ser:: {
20
- LSPSMessage , LSPSProtocolMessageHandler , LSPSRequestId , LSPSResponseError ,
24
+ LSPSMessage , LSPSProtocolMessageHandler , LSPSRequestId , LSPSResponseError , TimeProvider ,
21
25
JSONRPC_INTERNAL_ERROR_ERROR_CODE , JSONRPC_INTERNAL_ERROR_ERROR_MESSAGE ,
22
26
LSPS0_CLIENT_REJECTED_ERROR_CODE ,
23
27
} ;
@@ -400,18 +404,20 @@ struct OutboundJITChannel {
400
404
user_channel_id : u128 ,
401
405
opening_fee_params : LSPS2OpeningFeeParams ,
402
406
payment_size_msat : Option < u64 > ,
407
+ time_provider : Arc < dyn TimeProvider > ,
403
408
}
404
409
405
410
impl OutboundJITChannel {
406
411
fn new (
407
412
payment_size_msat : Option < u64 > , opening_fee_params : LSPS2OpeningFeeParams ,
408
- user_channel_id : u128 ,
413
+ user_channel_id : u128 , time_provider : Arc < dyn TimeProvider > ,
409
414
) -> Self {
410
415
Self {
411
416
user_channel_id,
412
417
state : OutboundJITChannelState :: new ( ) ,
413
418
opening_fee_params,
414
419
payment_size_msat,
420
+ time_provider,
415
421
}
416
422
}
417
423
@@ -451,7 +457,8 @@ impl OutboundJITChannel {
451
457
fn is_prunable ( & self ) -> bool {
452
458
// We deem an OutboundJITChannel prunable if our offer expired and we haven't intercepted
453
459
// any HTLCs initiating the flow yet.
454
- let is_expired = is_expired_opening_fee_params ( & self . opening_fee_params ) ;
460
+ let is_expired =
461
+ is_expired_opening_fee_params ( & self . opening_fee_params , self . time_provider . clone ( ) ) ;
455
462
self . is_pending_initial_payment ( ) && is_expired
456
463
}
457
464
}
@@ -481,13 +488,16 @@ impl PeerState {
481
488
self . outbound_channels_by_intercept_scid . insert ( intercept_scid, channel) ;
482
489
}
483
490
484
- fn prune_expired_request_state ( & mut self ) {
491
+ fn prune_expired_request_state ( & mut self , time_provider : Arc < dyn TimeProvider > ) {
485
492
self . pending_requests . retain ( |_, entry| {
486
493
match entry {
487
494
LSPS2Request :: GetInfo ( _) => false ,
488
495
LSPS2Request :: Buy ( request) => {
489
496
// Prune any expired buy requests.
490
- !is_expired_opening_fee_params ( & request. opening_fee_params )
497
+ !is_expired_opening_fee_params (
498
+ & request. opening_fee_params ,
499
+ time_provider. clone ( ) ,
500
+ )
491
501
} ,
492
502
}
493
503
} ) ;
@@ -566,16 +576,32 @@ where
566
576
peer_by_channel_id : RwLock < HashMap < ChannelId , PublicKey > > ,
567
577
total_pending_requests : AtomicUsize ,
568
578
config : LSPS2ServiceConfig ,
579
+ time_provider : Arc < dyn TimeProvider > ,
569
580
}
570
581
571
582
impl < CM : Deref > LSPS2ServiceHandler < CM >
572
583
where
573
584
CM :: Target : AChannelManager ,
574
585
{
586
+ #[ cfg( feature = "time" ) ]
575
587
/// Constructs a `LSPS2ServiceHandler`.
576
588
pub ( crate ) fn new (
577
589
pending_messages : Arc < MessageQueue > , pending_events : Arc < EventQueue > , channel_manager : CM ,
578
590
config : LSPS2ServiceConfig ,
591
+ ) -> Self {
592
+ let time_provider = Arc :: new ( DefaultTimeProvider ) ;
593
+ Self :: new_with_custom_time_provider (
594
+ pending_messages,
595
+ pending_events,
596
+ channel_manager,
597
+ config,
598
+ time_provider,
599
+ )
600
+ }
601
+
602
+ pub ( crate ) fn new_with_custom_time_provider (
603
+ pending_messages : Arc < MessageQueue > , pending_events : Arc < EventQueue > , channel_manager : CM ,
604
+ config : LSPS2ServiceConfig , time_provider : Arc < dyn TimeProvider > ,
579
605
) -> Self {
580
606
Self {
581
607
pending_messages,
@@ -586,6 +612,7 @@ where
586
612
total_pending_requests : AtomicUsize :: new ( 0 ) ,
587
613
channel_manager,
588
614
config,
615
+ time_provider,
589
616
}
590
617
}
591
618
@@ -737,6 +764,7 @@ where
737
764
buy_request. payment_size_msat ,
738
765
buy_request. opening_fee_params ,
739
766
user_channel_id,
767
+ self . time_provider . clone ( ) ,
740
768
) ;
741
769
742
770
peer_state_lock
@@ -1192,7 +1220,11 @@ where
1192
1220
}
1193
1221
1194
1222
// TODO: if payment_size_msat is specified, make sure our node has sufficient incoming liquidity from public network to receive it.
1195
- if !is_valid_opening_fee_params ( & params. opening_fee_params , & self . config . promise_secret ) {
1223
+ if !is_valid_opening_fee_params (
1224
+ & params. opening_fee_params ,
1225
+ & self . config . promise_secret ,
1226
+ self . time_provider . clone ( ) ,
1227
+ ) {
1196
1228
let response = LSPS2Response :: BuyError ( LSPSResponseError {
1197
1229
code : LSPS2_BUY_REQUEST_INVALID_OPENING_FEE_PARAMS_ERROR_CODE ,
1198
1230
message : "valid_until is already past OR the promise did not match the provided parameters" . to_string ( ) ,
@@ -1334,7 +1366,7 @@ where
1334
1366
let is_prunable =
1335
1367
if let Some ( inner_state_lock) = outer_state_lock. get ( & counterparty_node_id) {
1336
1368
let mut peer_state_lock = inner_state_lock. lock ( ) . unwrap ( ) ;
1337
- peer_state_lock. prune_expired_request_state ( ) ;
1369
+ peer_state_lock. prune_expired_request_state ( self . time_provider . clone ( ) ) ;
1338
1370
peer_state_lock. is_prunable ( )
1339
1371
} else {
1340
1372
return ;
@@ -1349,7 +1381,7 @@ where
1349
1381
let mut outer_state_lock = self . per_peer_state . write ( ) . unwrap ( ) ;
1350
1382
outer_state_lock. retain ( |_, inner_state_lock| {
1351
1383
let mut peer_state_lock = inner_state_lock. lock ( ) . unwrap ( ) ;
1352
- peer_state_lock. prune_expired_request_state ( ) ;
1384
+ peer_state_lock. prune_expired_request_state ( self . time_provider . clone ( ) ) ;
1353
1385
peer_state_lock. is_prunable ( ) == false
1354
1386
} ) ;
1355
1387
}
0 commit comments