Skip to content

Commit f73a54c

Browse files
committed
Add Api impl for ListForwardedPayments.
1 parent 9cb3e97 commit f73a54c

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use crate::io::{
2+
FORWARDED_PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE,
3+
FORWARDED_PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE,
4+
};
5+
use crate::service::Context;
6+
use bytes::Bytes;
7+
use ldk_server_protos::api::{ListForwardedPaymentsRequest, ListForwardedPaymentsResponse};
8+
use ldk_server_protos::types::{ForwardedPayment, PageToken};
9+
use prost::Message;
10+
11+
pub(crate) const LIST_FORWARDED_PAYMENTS_PATH: &str = "ListForwardedPayments";
12+
13+
pub(crate) fn handle_list_forwarded_payments_request(
14+
context: Context, request: ListForwardedPaymentsRequest,
15+
) -> Result<ListForwardedPaymentsResponse, ldk_node::NodeError> {
16+
let page_token = request.page_token.map(|p| (p.token, p.index));
17+
let list_response = context
18+
.paginated_kv_store
19+
.list(
20+
FORWARDED_PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE,
21+
FORWARDED_PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE,
22+
page_token,
23+
)
24+
.map_err(|_| ldk_node::NodeError::ConnectionFailed)?;
25+
26+
let mut forwarded_payments: Vec<ForwardedPayment> = vec![];
27+
for key in list_response.keys {
28+
let forwarded_payment_bytes = context
29+
.paginated_kv_store
30+
.read(
31+
FORWARDED_PAYMENTS_PERSISTENCE_PRIMARY_NAMESPACE,
32+
FORWARDED_PAYMENTS_PERSISTENCE_SECONDARY_NAMESPACE,
33+
&key,
34+
)
35+
.map_err(|_| ldk_node::NodeError::ConnectionFailed)?;
36+
let forwarded_payment = ForwardedPayment::decode(Bytes::from(forwarded_payment_bytes))
37+
.map_err(|_| ldk_node::NodeError::ConnectionFailed)?;
38+
forwarded_payments.push(forwarded_payment);
39+
}
40+
let response = ListForwardedPaymentsResponse {
41+
forwarded_payments,
42+
next_page_token: list_response
43+
.next_page_token
44+
.map(|(token, index)| PageToken { token, index }),
45+
};
46+
Ok(response)
47+
}

ldk-server/src/api/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ pub(crate) mod get_balances;
88
pub(crate) mod get_node_info;
99
pub(crate) mod get_payment_details;
1010
pub(crate) mod list_channels;
11+
pub(crate) mod list_forwarded_payments;
1112
pub(crate) mod list_payments;
1213
pub(crate) mod onchain_receive;
1314
pub(crate) mod onchain_send;

ldk-server/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ fn main() {
204204
match res {
205205
Ok((stream, _)) => {
206206
let io_stream = TokioIo::new(stream);
207-
let node_service = NodeService::new(Arc::clone(&node));
207+
let node_service = NodeService::new(Arc::clone(&node), Arc::clone(&paginated_store) as Arc<dyn PaginatedKVStore + Send + Sync>);
208208
runtime.spawn(async move {
209209
if let Err(err) = http1::Builder::new().serve_connection(io_stream, node_service).await {
210210
eprintln!("Failed to serve connection: {}", err);

ldk-server/src/service.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,28 @@ use crate::api::open_channel::{handle_open_channel, OPEN_CHANNEL_PATH};
2525
use crate::api::update_channel_config::{
2626
handle_update_channel_config_request, UPDATE_CHANNEL_CONFIG_PATH,
2727
};
28+
use crate::io::paginated_kv_store::PaginatedKVStore;
2829
use std::future::Future;
2930
use std::pin::Pin;
3031
use std::sync::Arc;
3132

3233
#[derive(Clone)]
3334
pub struct NodeService {
3435
node: Arc<Node>,
36+
paginated_kv_store: Arc<dyn PaginatedKVStore + Send + Sync>,
3537
}
3638

3739
impl NodeService {
38-
pub(crate) fn new(node: Arc<Node>) -> Self {
39-
Self { node }
40+
pub(crate) fn new(
41+
node: Arc<Node>, paginated_kv_store: Arc<dyn PaginatedKVStore + Send + Sync>,
42+
) -> Self {
43+
Self { node, paginated_kv_store }
4044
}
4145
}
4246

4347
pub(crate) struct Context {
4448
pub(crate) node: Arc<Node>,
49+
pub(crate) paginated_kv_store: Arc<dyn PaginatedKVStore + Send + Sync>,
4550
}
4651

4752
impl Service<Request<Incoming>> for NodeService {
@@ -50,7 +55,10 @@ impl Service<Request<Incoming>> for NodeService {
5055
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;
5156

5257
fn call(&self, req: Request<Incoming>) -> Self::Future {
53-
let context = Context { node: Arc::clone(&self.node) };
58+
let context = Context {
59+
node: Arc::clone(&self.node),
60+
paginated_kv_store: Arc::clone(&self.paginated_kv_store),
61+
};
5462
// Exclude '/' from path pattern matching.
5563
match &req.uri().path()[1..] {
5664
GET_NODE_INFO => Box::pin(handle_request(context, req, handle_get_node_info_request)),

0 commit comments

Comments
 (0)