10
10
//! Contains the main LSPS2 server-side object, [`LSPS2ServiceHandler`].
11
11
12
12
use crate :: events:: { Event , EventQueue } ;
13
- use crate :: lsps0:: ser:: { ProtocolMessageHandler , RequestId , ResponseError } ;
13
+ use crate :: lsps0:: ser:: {
14
+ ProtocolMessageHandler , RequestId , ResponseError , LSPS0_CLIENT_REJECTED_ERROR_CODE ,
15
+ } ;
14
16
use crate :: lsps2:: event:: LSPS2ServiceEvent ;
15
17
use crate :: lsps2:: payment_queue:: { InterceptedHTLC , PaymentQueue } ;
16
18
use crate :: lsps2:: utils:: { compute_opening_fee, is_valid_opening_fee_params} ;
@@ -40,6 +42,8 @@ use crate::lsps2::msgs::{
40
42
LSPS2_GET_INFO_REQUEST_UNRECOGNIZED_OR_STALE_TOKEN_ERROR_CODE ,
41
43
} ;
42
44
45
+ const MAX_PENDING_REQUESTS_PER_PEER : usize = 10 ;
46
+
43
47
/// Server-side configuration options for JIT channels.
44
48
#[ derive( Clone , Debug ) ]
45
49
pub struct LSPS2ServiceConfig {
@@ -982,21 +986,49 @@ where
982
986
fn handle_get_info_request (
983
987
& self , request_id : RequestId , counterparty_node_id : & PublicKey , params : GetInfoRequest ,
984
988
) -> Result < ( ) , LightningError > {
985
- let mut outer_state_lock = self . per_peer_state . write ( ) . unwrap ( ) ;
986
- let inner_state_lock: & mut Mutex < PeerState > =
987
- outer_state_lock. entry ( * counterparty_node_id) . or_insert ( Mutex :: new ( PeerState :: new ( ) ) ) ;
988
- let mut peer_state_lock = inner_state_lock. lock ( ) . unwrap ( ) ;
989
- peer_state_lock
990
- . pending_requests
991
- . insert ( request_id. clone ( ) , LSPS2Request :: GetInfo ( params. clone ( ) ) ) ;
992
-
993
- let event = Event :: LSPS2Service ( LSPS2ServiceEvent :: GetInfo {
994
- request_id,
995
- counterparty_node_id : * counterparty_node_id,
996
- token : params. token ,
997
- } ) ;
998
- self . pending_events . enqueue ( event) ;
999
- Ok ( ( ) )
989
+ let ( result, response) = {
990
+ let mut outer_state_lock = self . per_peer_state . write ( ) . unwrap ( ) ;
991
+ let inner_state_lock: & mut Mutex < PeerState > = outer_state_lock
992
+ . entry ( * counterparty_node_id)
993
+ . or_insert ( Mutex :: new ( PeerState :: new ( ) ) ) ;
994
+ let mut peer_state_lock = inner_state_lock. lock ( ) . unwrap ( ) ;
995
+ if peer_state_lock. pending_requests . len ( ) < MAX_PENDING_REQUESTS_PER_PEER {
996
+ peer_state_lock
997
+ . pending_requests
998
+ . insert ( request_id. clone ( ) , LSPS2Request :: GetInfo ( params. clone ( ) ) ) ;
999
+
1000
+ let event = Event :: LSPS2Service ( LSPS2ServiceEvent :: GetInfo {
1001
+ request_id,
1002
+ counterparty_node_id : * counterparty_node_id,
1003
+ token : params. token ,
1004
+ } ) ;
1005
+ self . pending_events . enqueue ( event) ;
1006
+ ( Ok ( ( ) ) , None )
1007
+ } else {
1008
+ let response = LSPS2Response :: GetInfoError ( ResponseError {
1009
+ code : LSPS0_CLIENT_REJECTED_ERROR_CODE ,
1010
+ message : "Reached maximum number of pending requests. Please try again later."
1011
+ . to_string ( ) ,
1012
+ data : None ,
1013
+ } ) ;
1014
+ let msg = Some ( LSPS2Message :: Response ( request_id, response) . into ( ) ) ;
1015
+
1016
+ let err = format ! (
1017
+ "Peer {} reached maximum number of pending requests: {}" ,
1018
+ counterparty_node_id, MAX_PENDING_REQUESTS_PER_PEER
1019
+ ) ;
1020
+
1021
+ let result =
1022
+ Err ( LightningError { err, action : ErrorAction :: IgnoreAndLog ( Level :: Debug ) } ) ;
1023
+ ( result, msg)
1024
+ }
1025
+ } ;
1026
+
1027
+ if let Some ( msg) = response {
1028
+ self . pending_messages . enqueue ( counterparty_node_id, msg) ;
1029
+ }
1030
+
1031
+ result
1000
1032
}
1001
1033
1002
1034
fn handle_buy_request (
@@ -1070,7 +1102,6 @@ where
1070
1102
}
1071
1103
1072
1104
// TODO: if payment_size_msat is specified, make sure our node has sufficient incoming liquidity from public network to receive it.
1073
-
1074
1105
if !is_valid_opening_fee_params ( & params. opening_fee_params , & self . config . promise_secret ) {
1075
1106
let response = LSPS2Response :: BuyError ( ResponseError {
1076
1107
code : LSPS2_BUY_REQUEST_INVALID_OPENING_FEE_PARAMS_ERROR_CODE ,
@@ -1085,26 +1116,52 @@ where
1085
1116
} ) ;
1086
1117
}
1087
1118
1088
- {
1119
+ let ( result , response ) = {
1089
1120
let mut outer_state_lock = self . per_peer_state . write ( ) . unwrap ( ) ;
1090
1121
let inner_state_lock = outer_state_lock
1091
1122
. entry ( * counterparty_node_id)
1092
1123
. or_insert ( Mutex :: new ( PeerState :: new ( ) ) ) ;
1093
1124
let mut peer_state_lock = inner_state_lock. lock ( ) . unwrap ( ) ;
1094
- peer_state_lock
1095
- . pending_requests
1096
- . insert ( request_id. clone ( ) , LSPS2Request :: Buy ( params. clone ( ) ) ) ;
1097
- }
1098
1125
1099
- let event = Event :: LSPS2Service ( LSPS2ServiceEvent :: BuyRequest {
1100
- request_id,
1101
- counterparty_node_id : * counterparty_node_id,
1102
- opening_fee_params : params. opening_fee_params ,
1103
- payment_size_msat : params. payment_size_msat ,
1104
- } ) ;
1105
- self . pending_events . enqueue ( event) ;
1126
+ if peer_state_lock. pending_requests . len ( ) < MAX_PENDING_REQUESTS_PER_PEER {
1127
+ peer_state_lock
1128
+ . pending_requests
1129
+ . insert ( request_id. clone ( ) , LSPS2Request :: Buy ( params. clone ( ) ) ) ;
1106
1130
1107
- Ok ( ( ) )
1131
+ let event = Event :: LSPS2Service ( LSPS2ServiceEvent :: BuyRequest {
1132
+ request_id,
1133
+ counterparty_node_id : * counterparty_node_id,
1134
+ opening_fee_params : params. opening_fee_params ,
1135
+ payment_size_msat : params. payment_size_msat ,
1136
+ } ) ;
1137
+ self . pending_events . enqueue ( event) ;
1138
+
1139
+ ( Ok ( ( ) ) , None )
1140
+ } else {
1141
+ let response = LSPS2Response :: BuyError ( ResponseError {
1142
+ code : LSPS0_CLIENT_REJECTED_ERROR_CODE ,
1143
+ message : "Reached maximum number of pending requests. Please try again later."
1144
+ . to_string ( ) ,
1145
+ data : None ,
1146
+ } ) ;
1147
+ let msg = Some ( LSPS2Message :: Response ( request_id, response) . into ( ) ) ;
1148
+
1149
+ let err = format ! (
1150
+ "Peer {} reached maximum number of pending requests: {}" ,
1151
+ counterparty_node_id, MAX_PENDING_REQUESTS_PER_PEER
1152
+ ) ;
1153
+ let result =
1154
+ Err ( LightningError { err, action : ErrorAction :: IgnoreAndLog ( Level :: Debug ) } ) ;
1155
+
1156
+ ( result, msg)
1157
+ }
1158
+ } ;
1159
+
1160
+ if let Some ( msg) = response {
1161
+ self . pending_messages . enqueue ( counterparty_node_id, msg) ;
1162
+ }
1163
+
1164
+ result
1108
1165
}
1109
1166
}
1110
1167
0 commit comments