diff --git a/plugins/lsps-plugin/src/cln_adapters/mod.rs b/plugins/lsps-plugin/src/cln_adapters/mod.rs index 5427a919e..2aa0c761f 100644 --- a/plugins/lsps-plugin/src/cln_adapters/mod.rs +++ b/plugins/lsps-plugin/src/cln_adapters/mod.rs @@ -1,2 +1,3 @@ +pub mod sender; pub mod service; pub mod transport; diff --git a/plugins/lsps-plugin/src/cln_adapters/sender.rs b/plugins/lsps-plugin/src/cln_adapters/sender.rs new file mode 100644 index 000000000..236412b0b --- /dev/null +++ b/plugins/lsps-plugin/src/cln_adapters/sender.rs @@ -0,0 +1,40 @@ +use crate::{ + cln_adapters::utils::encode_lsps0_frame_hex, + core::transport::{Error as TransportError, MessageSender}, +}; +use async_trait::async_trait; +use bitcoin::secp256k1::PublicKey; +use cln_rpc::{model::requests::SendcustommsgRequest, ClnRpc}; +use std::path::PathBuf; + +#[derive(Clone)] +pub struct ClnSender { + rpc_path: PathBuf, +} + +impl ClnSender { + pub fn new(rpc_path: PathBuf) -> Self { + Self { rpc_path } + } +} + +#[async_trait] +impl MessageSender for ClnSender { + async fn send(&self, peer_id: &PublicKey, payload: &[u8]) -> Result<(), TransportError> { + let mut rpc = ClnRpc::new(&self.rpc_path) + .await + .map_err(|e| TransportError::Internal(e.to_string()))?; + + // Encode frame for LSPS0 Bolt8 transport. + let msg = encode_lsps0_frame_hex(payload); + + rpc.call_typed(&SendcustommsgRequest { + msg, + node_id: peer_id.to_owned(), + }) + .await + .map_err(|e| TransportError::Internal(e.to_string()))?; + + Ok(()) + } +}