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