diff --git a/plugins/.gitignore b/plugins/.gitignore index 669c440ce..020252ce6 100644 --- a/plugins/.gitignore +++ b/plugins/.gitignore @@ -20,4 +20,4 @@ cln-askrene recklessrpc exposesecret cln-xpay -cln-lsps +cln-lsps-client diff --git a/plugins/Makefile b/plugins/Makefile index 1110452fa..5618e52a1 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -147,8 +147,10 @@ plugins/cln-grpc: target/${RUST_PROFILE}/cln-grpc @cp $< $@ plugins/clnrest: target/${RUST_PROFILE}/clnrest @cp $< $@ +plugins/cln-lsps-client: target/${RUST_PROFILE}/cln-lsps-client + @cp $< $@ -PLUGINS += plugins/cln-grpc plugins/clnrest plugins/cln-lsps +PLUGINS += plugins/cln-grpc plugins/clnrest plugins/cln-lsps-client endif PLUGIN_COMMON_OBJS := \ @@ -306,10 +308,12 @@ target/${RUST_PROFILE}/cln-grpc: ${CLN_PLUGIN_SRC} ${CLN_GRPC_PLUGIN_SRC} $(MSGG cargo build ${CARGO_OPTS} --bin cln-grpc target/${RUST_PROFILE}/clnrest: ${CLN_REST_PLUGIN_SRC} cargo build ${CARGO_OPTS} --bin clnrest +target/${RUST_PROFILE}/cln-lsps-client: ${CLN_LSPS_PLUGIN_SRC} + cargo build ${CARGO_OPTS} --bin cln-lsps-client ifneq ($(RUST),0) include plugins/rest-plugin/Makefile -DEFAULT_TARGETS += $(CLN_PLUGIN_EXAMPLES) plugins/cln-grpc plugins/clnrest +DEFAULT_TARGETS += $(CLN_PLUGIN_EXAMPLES) plugins/cln-grpc plugins/clnrest plugins/cln-lsps-client endif clean: plugins-clean diff --git a/plugins/lsps-plugin/Cargo.toml b/plugins/lsps-plugin/Cargo.toml index 012a3cc90..e743eeaa2 100644 --- a/plugins/lsps-plugin/Cargo.toml +++ b/plugins/lsps-plugin/Cargo.toml @@ -3,6 +3,10 @@ name = "cln-lsps" version = "0.1.0" edition = "2021" +[[bin]] +name = "cln-lsps-client" +path = "src/client.rs" + [dependencies] anyhow = "1.0" async-trait = "0.1" diff --git a/plugins/lsps-plugin/src/client.rs b/plugins/lsps-plugin/src/client.rs new file mode 100644 index 000000000..c54699c67 --- /dev/null +++ b/plugins/lsps-plugin/src/client.rs @@ -0,0 +1,64 @@ +use cln_lsps::jsonrpc::client::JsonRpcClient; +use cln_lsps::lsps0::{ + self, + transport::{Bolt8Transport, CustomMessageHookManager, WithCustomMessageHookManager}, +}; +use serde::Deserialize; +use std::path::Path; + +#[derive(Clone)] +struct State { + hook_manager: CustomMessageHookManager, +} + +impl WithCustomMessageHookManager for State { + fn get_custommsg_hook_manager(&self) -> &CustomMessageHookManager { + &self.hook_manager + } +} + +#[tokio::main] +async fn main() -> Result<(), anyhow::Error> { + let hook_manager = CustomMessageHookManager::new(); + let state = State { hook_manager }; + + if let Some(plugin) = cln_plugin::Builder::new(tokio::io::stdin(), tokio::io::stdout()) + .hook("custommsg", CustomMessageHookManager::on_custommsg::) + .rpcmethod( + "lsps-listprotocols", + "list protocols supported by lsp", + on_lsps_listprotocols, + ) + .start(state) + .await? + { + plugin.join().await + } else { + Ok(()) + } +} + +async fn on_lsps_listprotocols( + p: cln_plugin::Plugin, + v: serde_json::Value, +) -> Result { + #[derive(Deserialize)] + struct Request { + peer: String, + } + let dir = p.configuration().lightning_dir; + let rpc_path = Path::new(&dir).join(&p.configuration().rpc_file); + + let req: Request = serde_json::from_value(v).unwrap(); + + let client = JsonRpcClient::new(Bolt8Transport::new( + &req.peer, + rpc_path, + p.state().hook_manager.clone(), + None, + )?); + let res: lsps0::model::Lsps0listProtocolsResponse = client + .call_typed(lsps0::model::Lsps0listProtocolsRequest {}) + .await?; + Ok(serde_json::to_value(res)?) +} diff --git a/plugins/lsps-plugin/src/lib.rs b/plugins/lsps-plugin/src/lib.rs index e61d9faae..8d4044c19 100644 --- a/plugins/lsps-plugin/src/lib.rs +++ b/plugins/lsps-plugin/src/lib.rs @@ -1,2 +1,2 @@ -mod jsonrpc; -mod lsps0; +pub mod jsonrpc; +pub mod lsps0; diff --git a/plugins/lsps-plugin/src/main.rs b/plugins/lsps-plugin/src/main.rs deleted file mode 100644 index e7a11a969..000000000 --- a/plugins/lsps-plugin/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -}