Skip to content

Commit fed5a3a

Browse files
committed
lsp_plugin: refactor lsps0listprotocols handler
Move the handler to a separate file, and add lsps2_enabled flag to the handler. Signed-off-by: Peter Neuroth <pet.v.ne@gmail.com>
1 parent 1eb0ffd commit fed5a3a

File tree

3 files changed

+98
-20
lines changed

3 files changed

+98
-20
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
use crate::{
2+
jsonrpc::{server::RequestHandler, JsonRpcResponse, RequestObject, RpcError},
3+
lsps0::model::{Lsps0listProtocolsRequest, Lsps0listProtocolsResponse},
4+
util::unwrap_payload_with_peer_id,
5+
};
6+
use async_trait::async_trait;
7+
8+
pub struct Lsps0ListProtocolsHandler {
9+
pub lsps2_enabled: bool,
10+
}
11+
12+
#[async_trait]
13+
impl RequestHandler for Lsps0ListProtocolsHandler {
14+
async fn handle(&self, payload: &[u8]) -> core::result::Result<Vec<u8>, RpcError> {
15+
let (payload, _) = unwrap_payload_with_peer_id(payload);
16+
17+
let req: RequestObject<Lsps0listProtocolsRequest> =
18+
serde_json::from_slice(&payload).unwrap();
19+
if let Some(id) = req.id {
20+
let mut protocols = vec![];
21+
if self.lsps2_enabled {
22+
protocols.push(2);
23+
}
24+
let res = Lsps0listProtocolsResponse { protocols }.into_response(id);
25+
let res_vec = serde_json::to_vec(&res).unwrap();
26+
return Ok(res_vec);
27+
}
28+
// If request has no ID (notification), return empty Ok result.
29+
Ok(vec![])
30+
}
31+
}
32+
33+
#[cfg(test)]
34+
mod test {
35+
use super::*;
36+
use crate::{
37+
jsonrpc::{JsonRpcRequest, ResponseObject},
38+
util::wrap_payload_with_peer_id,
39+
};
40+
use cln_rpc::primitives::PublicKey;
41+
42+
const PUBKEY: [u8; 33] = [
43+
0x02, 0x79, 0xbe, 0x66, 0x7e, 0xf9, 0xdc, 0xbb, 0xac, 0x55, 0xa0, 0x62, 0x95, 0xce, 0x87,
44+
0x0b, 0x07, 0x02, 0x9b, 0xfc, 0xdb, 0x2d, 0xce, 0x28, 0xd9, 0x59, 0xf2, 0x81, 0x5b, 0x16,
45+
0xf8, 0x17, 0x98,
46+
];
47+
48+
fn create_peer_id() -> PublicKey {
49+
PublicKey::from_slice(&PUBKEY).expect("Valid pubkey")
50+
}
51+
52+
fn create_wrapped_request(request: &RequestObject<Lsps0listProtocolsRequest>) -> Vec<u8> {
53+
let payload = serde_json::to_vec(request).expect("Failed to serialize request");
54+
wrap_payload_with_peer_id(&payload, create_peer_id())
55+
}
56+
57+
#[tokio::test]
58+
async fn test_lsps2_disabled_returns_empty_protocols() {
59+
let handler = Lsps0ListProtocolsHandler {
60+
lsps2_enabled: false,
61+
};
62+
63+
let request = Lsps0listProtocolsRequest {}.into_request(Some("test-id".to_string()));
64+
let payload = create_wrapped_request(&request);
65+
66+
let result = handler.handle(&payload).await.unwrap();
67+
let response: ResponseObject<Lsps0listProtocolsResponse> =
68+
serde_json::from_slice(&result).unwrap();
69+
70+
let data = response.into_inner().expect("Should have result data");
71+
assert!(data.protocols.is_empty());
72+
}
73+
74+
#[tokio::test]
75+
async fn test_lsps2_enabled_returns_protocol_2() {
76+
let handler = Lsps0ListProtocolsHandler {
77+
lsps2_enabled: true,
78+
};
79+
80+
let request = Lsps0listProtocolsRequest {}.into_request(Some("test-id".to_string()));
81+
let payload = create_wrapped_request(&request);
82+
83+
let result = handler.handle(&payload).await.unwrap();
84+
let response: ResponseObject<Lsps0listProtocolsResponse> =
85+
serde_json::from_slice(&result).unwrap();
86+
87+
let data = response.into_inner().expect("Should have result data");
88+
assert_eq!(data.protocols, vec![2]);
89+
}
90+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod handler;
12
pub mod model;
23
pub mod primitives;
34
pub mod transport;

plugins/lsps-plugin/src/service.rs

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use anyhow::anyhow;
22
use async_trait::async_trait;
3-
use cln_lsps::jsonrpc::server::{JsonRpcResponseWriter, RequestHandler};
3+
use cln_lsps::jsonrpc::server::JsonRpcResponseWriter;
4+
use cln_lsps::jsonrpc::TransportError;
45
use cln_lsps::jsonrpc::{server::JsonRpcServer, JsonRpcRequest};
5-
use cln_lsps::jsonrpc::{JsonRpcResponse, RequestObject, RpcError, TransportError};
6-
use cln_lsps::lsps0::model::{Lsps0listProtocolsRequest, Lsps0listProtocolsResponse};
6+
use cln_lsps::lsps0::handler::Lsps0ListProtocolsHandler;
7+
use cln_lsps::lsps0::model::Lsps0listProtocolsRequest;
78
use cln_lsps::lsps0::transport::{self, CustomMsg};
89
use cln_lsps::util::wrap_payload_with_peer_id;
910
use cln_lsps::{lsps0, util, LSP_FEATURE_BIT};
@@ -51,7 +52,9 @@ async fn main() -> Result<(), anyhow::Error> {
5152

5253
let lsps_builder = JsonRpcServer::builder().with_handler(
5354
Lsps0listProtocolsRequest::METHOD.to_string(),
54-
Arc::new(Lsps0ListProtocolsHandler {}),
55+
Arc::new(Lsps0ListProtocolsHandler {
56+
lsps2_enabled: false,
57+
}),
5558
);
5659
let lsps_service = lsps_builder.build();
5760

@@ -115,19 +118,3 @@ impl JsonRpcResponseWriter for LspsResponseWriter {
115118
transport::send_custommsg(&mut client, payload.to_vec(), self.peer_id).await
116119
}
117120
}
118-
119-
pub struct Lsps0ListProtocolsHandler;
120-
121-
#[async_trait]
122-
impl RequestHandler for Lsps0ListProtocolsHandler {
123-
async fn handle(&self, payload: &[u8]) -> core::result::Result<Vec<u8>, RpcError> {
124-
let req: RequestObject<Lsps0listProtocolsRequest> =
125-
serde_json::from_slice(payload).unwrap();
126-
if let Some(id) = req.id {
127-
let res = Lsps0listProtocolsResponse { protocols: vec![] }.into_response(id);
128-
let res_vec = serde_json::to_vec(&res).unwrap();
129-
return Ok(res_vec);
130-
}
131-
Ok(vec![])
132-
}
133-
}

0 commit comments

Comments
 (0)