@@ -21,7 +21,6 @@ use crate::lsps5::msgs::{
2121use crate :: message_queue:: MessageQueue ;
2222use crate :: prelude:: { new_hash_map, HashMap } ;
2323use crate :: sync:: { Arc , Mutex , RwLock } ;
24- use crate :: utils:: bounded_map:: BoundedMap ;
2524use crate :: utils:: generate_request_id;
2625
2726use super :: msgs:: { LSPS5AppName , LSPS5Error , LSPS5WebhookUrl } ;
@@ -32,28 +31,68 @@ use lightning::ln::msgs::{ErrorAction, LightningError};
3231use lightning:: sign:: EntropySource ;
3332use lightning:: util:: logger:: Level ;
3433
34+ use alloc:: collections:: VecDeque ;
3535use alloc:: string:: String ;
3636
3737use core:: ops:: Deref ;
3838
39+ impl PartialEq < LSPSRequestId > for ( LSPSRequestId , ( LSPS5AppName , LSPS5WebhookUrl ) ) {
40+ fn eq ( & self , other : & LSPSRequestId ) -> bool {
41+ & self . 0 == other
42+ }
43+ }
44+
45+ impl PartialEq < LSPSRequestId > for ( LSPSRequestId , LSPS5AppName ) {
46+ fn eq ( & self , other : & LSPSRequestId ) -> bool {
47+ & self . 0 == other
48+ }
49+ }
50+
3951#[ derive( Debug , Clone , Copy , Default ) ]
4052/// Configuration for the LSPS5 client
4153pub struct LSPS5ClientConfig { }
4254
4355struct PeerState {
44- pending_set_webhook_requests : BoundedMap < LSPSRequestId , ( LSPS5AppName , LSPS5WebhookUrl ) > ,
45- pending_list_webhooks_requests : BoundedMap < LSPSRequestId , ( ) > ,
46- pending_remove_webhook_requests : BoundedMap < LSPSRequestId , LSPS5AppName > ,
56+ pending_set_webhook_requests : VecDeque < ( LSPSRequestId , ( LSPS5AppName , LSPS5WebhookUrl ) ) > ,
57+ pending_list_webhooks_requests : VecDeque < LSPSRequestId > ,
58+ pending_remove_webhook_requests : VecDeque < ( LSPSRequestId , LSPS5AppName ) > ,
4759}
4860
4961const MAX_PENDING_REQUESTS : usize = 5 ;
5062
5163impl PeerState {
5264 fn new ( ) -> Self {
5365 Self {
54- pending_set_webhook_requests : BoundedMap :: new ( MAX_PENDING_REQUESTS ) ,
55- pending_list_webhooks_requests : BoundedMap :: new ( MAX_PENDING_REQUESTS ) ,
56- pending_remove_webhook_requests : BoundedMap :: new ( MAX_PENDING_REQUESTS ) ,
66+ pending_set_webhook_requests : VecDeque :: with_capacity ( MAX_PENDING_REQUESTS ) ,
67+ pending_list_webhooks_requests : VecDeque :: with_capacity ( MAX_PENDING_REQUESTS ) ,
68+ pending_remove_webhook_requests : VecDeque :: with_capacity ( MAX_PENDING_REQUESTS ) ,
69+ }
70+ }
71+
72+ fn add_request < T , F > ( & mut self , item : T , queue_selector : F )
73+ where
74+ F : FnOnce ( & mut Self ) -> & mut VecDeque < T > ,
75+ {
76+ let queue = queue_selector ( self ) ;
77+ if queue. len ( ) == MAX_PENDING_REQUESTS {
78+ queue. pop_front ( ) ;
79+ }
80+ queue. push_back ( item) ;
81+ }
82+
83+ fn find_and_remove_request < T , F > (
84+ & mut self , queue_selector : F , request_id : & LSPSRequestId ,
85+ ) -> Option < T >
86+ where
87+ F : FnOnce ( & mut Self ) -> & mut VecDeque < T > ,
88+ T : Clone ,
89+ for < ' a > & ' a T : PartialEq < & ' a LSPSRequestId > ,
90+ {
91+ let queue = queue_selector ( self ) ;
92+ if let Some ( pos) = queue. iter ( ) . position ( |item| item == request_id) {
93+ queue. remove ( pos)
94+ } else {
95+ None
5796 }
5897 }
5998
@@ -162,9 +201,10 @@ where
162201 let request_id = generate_request_id ( & self . entropy_source ) ;
163202
164203 self . with_peer_state ( counterparty_node_id, |peer_state| {
165- peer_state
166- . pending_set_webhook_requests
167- . insert ( request_id. clone ( ) , ( app_name. clone ( ) , lsps_webhook_url. clone ( ) ) ) ;
204+ peer_state. add_request (
205+ ( request_id. clone ( ) , ( app_name. clone ( ) , lsps_webhook_url. clone ( ) ) ) ,
206+ |s| & mut s. pending_set_webhook_requests ,
207+ ) ;
168208 } ) ;
169209
170210 let request =
@@ -196,7 +236,7 @@ where
196236 let request_id = generate_request_id ( & self . entropy_source ) ;
197237
198238 self . with_peer_state ( counterparty_node_id, |peer_state| {
199- peer_state. pending_list_webhooks_requests . insert ( request_id. clone ( ) , ( ) ) ;
239+ peer_state. add_request ( request_id. clone ( ) , |s| & mut s . pending_list_webhooks_requests ) ;
200240 } ) ;
201241
202242 let request = LSPS5Request :: ListWebhooks ( ListWebhooksRequest { } ) ;
@@ -233,7 +273,9 @@ where
233273 let request_id = generate_request_id ( & self . entropy_source ) ;
234274
235275 self . with_peer_state ( counterparty_node_id, |peer_state| {
236- peer_state. pending_remove_webhook_requests . insert ( request_id. clone ( ) , app_name. clone ( ) ) ;
276+ peer_state. add_request ( ( request_id. clone ( ) , app_name. clone ( ) ) , |s| {
277+ & mut s. pending_remove_webhook_requests
278+ } ) ;
237279 } ) ;
238280
239281 let request = LSPS5Request :: RemoveWebhook ( RemoveWebhookRequest { app_name } ) ;
@@ -264,8 +306,8 @@ where
264306 } ) ;
265307 let event_queue_notifier = self . pending_events . notifier ( ) ;
266308 let handle_response = |peer_state : & mut PeerState | {
267- if let Some ( ( app_name, webhook_url) ) =
268- peer_state . pending_set_webhook_requests . remove ( & request_id)
309+ if let Some ( ( _ , ( app_name, webhook_url) ) ) = peer_state
310+ . find_and_remove_request ( |s| & mut s . pending_set_webhook_requests , & request_id)
269311 {
270312 match & response {
271313 LSPS5Response :: SetWebhook ( r) => {
@@ -297,7 +339,9 @@ where
297339 } ) ;
298340 } ,
299341 }
300- } else if peer_state. pending_list_webhooks_requests . remove ( & request_id) . is_some ( ) {
342+ } else if let Some ( _) = peer_state
343+ . find_and_remove_request ( |s| & mut s. pending_list_webhooks_requests , & request_id)
344+ {
301345 match & response {
302346 LSPS5Response :: ListWebhooks ( r) => {
303347 event_queue_notifier. enqueue ( LSPS5ClientEvent :: WebhooksListed {
@@ -315,8 +359,8 @@ where
315359 } ) ;
316360 } ,
317361 }
318- } else if let Some ( app_name) =
319- peer_state . pending_remove_webhook_requests . remove ( & request_id)
362+ } else if let Some ( ( _ , app_name) ) = peer_state
363+ . find_and_remove_request ( |s| & mut s . pending_remove_webhook_requests , & request_id)
320364 {
321365 match & response {
322366 LSPS5Response :: RemoveWebhook ( _) => {
@@ -449,10 +493,16 @@ mod tests {
449493 let outer_state_lock = client. per_peer_state . read ( ) . unwrap ( ) ;
450494
451495 let peer_1_state = outer_state_lock. get ( & peer_1) . unwrap ( ) . lock ( ) . unwrap ( ) ;
452- assert ! ( peer_1_state. pending_set_webhook_requests. contains_key( & req_id_1) ) ;
496+ assert ! ( peer_1_state
497+ . pending_set_webhook_requests
498+ . iter( )
499+ . any( |( id, _) | id == & req_id_1) ) ;
453500
454501 let peer_2_state = outer_state_lock. get ( & peer_2) . unwrap ( ) . lock ( ) . unwrap ( ) ;
455- assert ! ( peer_2_state. pending_set_webhook_requests. contains_key( & req_id_2) ) ;
502+ assert ! ( peer_2_state
503+ . pending_set_webhook_requests
504+ . iter( )
505+ . any( |( id, _) | id == & req_id_2) ) ;
456506 }
457507 }
458508
@@ -471,17 +521,21 @@ mod tests {
471521 {
472522 let outer_state_lock = client. per_peer_state . read ( ) . unwrap ( ) ;
473523 let peer_state = outer_state_lock. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
474- assert_eq ! (
475- peer_state. pending_set_webhook_requests. get( & set_req_id) . unwrap( ) ,
476- & ( lsps5_app_name. clone( ) , lsps5_webhook_url)
477- ) ;
524+ let set_request = peer_state
525+ . pending_set_webhook_requests
526+ . iter ( )
527+ . find ( |( id, _) | id == & set_req_id)
528+ . unwrap ( ) ;
529+ assert_eq ! ( & set_request. 1 , & ( lsps5_app_name. clone( ) , lsps5_webhook_url) ) ;
478530
479- assert ! ( peer_state. pending_list_webhooks_requests. contains_key ( & list_req_id) ) ;
531+ assert ! ( peer_state. pending_list_webhooks_requests. contains ( & list_req_id) ) ;
480532
481- assert_eq ! (
482- peer_state. pending_remove_webhook_requests. get( & remove_req_id) . unwrap( ) ,
483- & lsps5_app_name
484- ) ;
533+ let remove_request = peer_state
534+ . pending_remove_webhook_requests
535+ . iter ( )
536+ . find ( |( id, _) | id == & remove_req_id)
537+ . unwrap ( ) ;
538+ assert_eq ! ( & remove_request. 1 , & lsps5_app_name) ;
485539 }
486540 }
487541
@@ -523,7 +577,7 @@ mod tests {
523577 let outer_state_lock = client. per_peer_state . read ( ) . unwrap ( ) ;
524578 let peer_state = outer_state_lock. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
525579 for req_id in & request_ids {
526- assert ! ( peer_state. pending_set_webhook_requests. contains_key ( req_id) ) ;
580+ assert ! ( peer_state. pending_set_webhook_requests. iter ( ) . any ( | ( id , _ ) | id == req_id) ) ;
527581 }
528582 assert_eq ! ( peer_state. pending_set_webhook_requests. len( ) , MAX_PENDING_REQUESTS ) ;
529583 }
@@ -537,13 +591,19 @@ mod tests {
537591 let peer_state = outer_state_lock. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
538592 assert_eq ! ( peer_state. pending_set_webhook_requests. len( ) , MAX_PENDING_REQUESTS ) ;
539593
540- assert ! ( !peer_state. pending_set_webhook_requests. contains_key( & request_ids[ 0 ] ) ) ;
594+ assert ! ( !peer_state
595+ . pending_set_webhook_requests
596+ . iter( )
597+ . any( |( id, _) | id == & request_ids[ 0 ] ) ) ;
541598
542599 for req_id in & request_ids[ 1 ..] {
543- assert ! ( peer_state. pending_set_webhook_requests. contains_key ( req_id) ) ;
600+ assert ! ( peer_state. pending_set_webhook_requests. iter ( ) . any ( | ( id , _ ) | id == req_id) ) ;
544601 }
545602
546- assert ! ( peer_state. pending_set_webhook_requests. contains_key( & new_req_id) ) ;
603+ assert ! ( peer_state
604+ . pending_set_webhook_requests
605+ . iter( )
606+ . any( |( id, _) | id == & new_req_id) ) ;
547607 }
548608 }
549609
@@ -561,8 +621,11 @@ mod tests {
561621 let state = client. per_peer_state . read ( ) . unwrap ( ) ;
562622 assert ! ( state. contains_key( & peer) ) ;
563623 let peer_state = state. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
564- assert ! ( peer_state. pending_set_webhook_requests. contains_key( & set_webhook_req_id) ) ;
565- assert ! ( peer_state. pending_list_webhooks_requests. contains_key( & list_webhooks_req_id) ) ;
624+ assert ! ( peer_state
625+ . pending_set_webhook_requests
626+ . iter( )
627+ . any( |( id, _) | id == & set_webhook_req_id) ) ;
628+ assert ! ( peer_state. pending_list_webhooks_requests. contains( & list_webhooks_req_id) ) ;
566629 }
567630
568631 let set_webhook_response = LSPS5Response :: SetWebhook ( SetWebhookResponse {
@@ -579,8 +642,11 @@ mod tests {
579642 let state = client. per_peer_state . read ( ) . unwrap ( ) ;
580643 assert ! ( state. contains_key( & peer) ) ;
581644 let peer_state = state. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
582- assert ! ( !peer_state. pending_set_webhook_requests. contains_key( & set_webhook_req_id) ) ;
583- assert ! ( peer_state. pending_list_webhooks_requests. contains_key( & list_webhooks_req_id) ) ;
645+ assert ! ( !peer_state
646+ . pending_set_webhook_requests
647+ . iter( )
648+ . any( |( id, _) | id == & set_webhook_req_id) ) ;
649+ assert ! ( peer_state. pending_list_webhooks_requests. contains( & list_webhooks_req_id) ) ;
584650 }
585651
586652 let list_webhooks_response =
@@ -607,7 +673,10 @@ mod tests {
607673 let state = client. per_peer_state . read ( ) . unwrap ( ) ;
608674 assert ! ( state. contains_key( & peer) ) ;
609675 let peer_state = state. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
610- assert ! ( peer_state. pending_set_webhook_requests. contains_key( & new_req_id) ) ;
676+ assert ! ( peer_state
677+ . pending_set_webhook_requests
678+ . iter( )
679+ . any( |( id, _) | id == & new_req_id) ) ;
611680 }
612681 }
613682}
0 commit comments