@@ -21,7 +21,6 @@ use crate::lsps5::msgs::{
21
21
use crate :: message_queue:: MessageQueue ;
22
22
use crate :: prelude:: { new_hash_map, HashMap } ;
23
23
use crate :: sync:: { Arc , Mutex , RwLock } ;
24
- use crate :: utils:: bounded_map:: BoundedMap ;
25
24
use crate :: utils:: generate_request_id;
26
25
27
26
use super :: msgs:: { LSPS5AppName , LSPS5Error , LSPS5WebhookUrl } ;
@@ -32,28 +31,68 @@ use lightning::ln::msgs::{ErrorAction, LightningError};
32
31
use lightning:: sign:: EntropySource ;
33
32
use lightning:: util:: logger:: Level ;
34
33
34
+ use alloc:: collections:: VecDeque ;
35
35
use alloc:: string:: String ;
36
36
37
37
use core:: ops:: Deref ;
38
38
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
+
39
51
#[ derive( Debug , Clone , Copy , Default ) ]
40
52
/// Configuration for the LSPS5 client
41
53
pub struct LSPS5ClientConfig { }
42
54
43
55
struct 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 ) > ,
47
59
}
48
60
49
61
const MAX_PENDING_REQUESTS : usize = 5 ;
50
62
51
63
impl PeerState {
52
64
fn new ( ) -> Self {
53
65
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
57
96
}
58
97
}
59
98
@@ -162,9 +201,10 @@ where
162
201
let request_id = generate_request_id ( & self . entropy_source ) ;
163
202
164
203
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
+ ) ;
168
208
} ) ;
169
209
170
210
let request =
@@ -196,7 +236,7 @@ where
196
236
let request_id = generate_request_id ( & self . entropy_source ) ;
197
237
198
238
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 ) ;
200
240
} ) ;
201
241
202
242
let request = LSPS5Request :: ListWebhooks ( ListWebhooksRequest { } ) ;
@@ -233,7 +273,9 @@ where
233
273
let request_id = generate_request_id ( & self . entropy_source ) ;
234
274
235
275
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
+ } ) ;
237
279
} ) ;
238
280
239
281
let request = LSPS5Request :: RemoveWebhook ( RemoveWebhookRequest { app_name } ) ;
@@ -264,8 +306,8 @@ where
264
306
} ) ;
265
307
let event_queue_notifier = self . pending_events . notifier ( ) ;
266
308
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)
269
311
{
270
312
match & response {
271
313
LSPS5Response :: SetWebhook ( r) => {
@@ -297,7 +339,9 @@ where
297
339
} ) ;
298
340
} ,
299
341
}
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
+ {
301
345
match & response {
302
346
LSPS5Response :: ListWebhooks ( r) => {
303
347
event_queue_notifier. enqueue ( LSPS5ClientEvent :: WebhooksListed {
@@ -315,8 +359,8 @@ where
315
359
} ) ;
316
360
} ,
317
361
}
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)
320
364
{
321
365
match & response {
322
366
LSPS5Response :: RemoveWebhook ( _) => {
@@ -449,10 +493,16 @@ mod tests {
449
493
let outer_state_lock = client. per_peer_state . read ( ) . unwrap ( ) ;
450
494
451
495
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) ) ;
453
500
454
501
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) ) ;
456
506
}
457
507
}
458
508
@@ -471,17 +521,21 @@ mod tests {
471
521
{
472
522
let outer_state_lock = client. per_peer_state . read ( ) . unwrap ( ) ;
473
523
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) ) ;
478
530
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) ) ;
480
532
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) ;
485
539
}
486
540
}
487
541
@@ -523,7 +577,7 @@ mod tests {
523
577
let outer_state_lock = client. per_peer_state . read ( ) . unwrap ( ) ;
524
578
let peer_state = outer_state_lock. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
525
579
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) ) ;
527
581
}
528
582
assert_eq ! ( peer_state. pending_set_webhook_requests. len( ) , MAX_PENDING_REQUESTS ) ;
529
583
}
@@ -537,13 +591,19 @@ mod tests {
537
591
let peer_state = outer_state_lock. get ( & peer) . unwrap ( ) . lock ( ) . unwrap ( ) ;
538
592
assert_eq ! ( peer_state. pending_set_webhook_requests. len( ) , MAX_PENDING_REQUESTS ) ;
539
593
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 ] ) ) ;
541
598
542
599
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) ) ;
544
601
}
545
602
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) ) ;
547
607
}
548
608
}
549
609
@@ -561,8 +621,11 @@ mod tests {
561
621
let state = client. per_peer_state . read ( ) . unwrap ( ) ;
562
622
assert ! ( state. contains_key( & peer) ) ;
563
623
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) ) ;
566
629
}
567
630
568
631
let set_webhook_response = LSPS5Response :: SetWebhook ( SetWebhookResponse {
@@ -579,8 +642,11 @@ mod tests {
579
642
let state = client. per_peer_state . read ( ) . unwrap ( ) ;
580
643
assert ! ( state. contains_key( & peer) ) ;
581
644
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) ) ;
584
650
}
585
651
586
652
let list_webhooks_response =
@@ -607,7 +673,10 @@ mod tests {
607
673
let state = client. per_peer_state . read ( ) . unwrap ( ) ;
608
674
assert ! ( state. contains_key( & peer) ) ;
609
675
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) ) ;
611
680
}
612
681
}
613
682
}
0 commit comments