From 4bbfc612d594fe23282c439d4bdc446cff01ba1c Mon Sep 17 00:00:00 2001 From: Jonathan Underwood Date: Fri, 30 Jan 2026 23:42:40 +0900 Subject: [PATCH] feat: add-peer --- src/api.rs | 19 +++++++++++++++++++ src/client.rs | 8 ++++++++ src/raw_client.rs | 15 +++++++++++++++ src/types.rs | 2 ++ 4 files changed, 44 insertions(+) diff --git a/src/api.rs b/src/api.rs index 26cd769..428b690 100644 --- a/src/api.rs +++ b/src/api.rs @@ -172,6 +172,13 @@ where (**self).server_features() } + fn server_add_peer(&self, features: &S) -> Result + where + S: serde::Serialize, + { + (**self).server_add_peer(features) + } + fn ping(&self) -> Result<(), Error> { (**self).ping() } @@ -398,6 +405,11 @@ pub trait ElectrumApi { /// Returns the capabilities of the server. fn server_features(&self) -> Result; + /// Announce a server to get it listed in the peer list. + fn server_add_peer(&self, features: &S) -> Result + where + S: serde::Serialize; + /// Pings the server. This method can also be used as a "dummy" call to trigger the processing /// of incoming block header or script notifications. fn ping(&self) -> Result<(), Error>; @@ -607,6 +619,13 @@ mod test { unreachable!() } + fn server_add_peer(&self, _: &S) -> Result + where + S: serde::Serialize, + { + unreachable!() + } + fn ping(&self) -> Result<(), super::Error> { unreachable!() } diff --git a/src/client.rs b/src/client.rs index 1ed336b..f80b691 100644 --- a/src/client.rs +++ b/src/client.rs @@ -367,6 +367,14 @@ impl ElectrumApi for Client { impl_inner_call!(self, ping) } + #[inline] + fn server_add_peer(&self, features: &S) -> Result + where + S: serde::Serialize, + { + impl_inner_call!(self, server_add_peer, features) + } + #[inline] #[cfg(feature = "debug-calls")] fn calls_made(&self) -> Result { diff --git a/src/raw_client.rs b/src/raw_client.rs index 5d67467..0bcb6d3 100644 --- a/src/raw_client.rs +++ b/src/raw_client.rs @@ -1179,6 +1179,21 @@ impl ElectrumApi for RawClient { Ok(serde_json::from_value(result)?) } + fn server_add_peer(&self, features: &S) -> Result + where + S: serde::Serialize, + { + let json = serde_json::to_value(features)?; + let req = Request::new_id( + self.last_id.fetch_add(1, Ordering::SeqCst), + "server.add_peer", + vec![Param::Json(json)], + ); + let result = self.call(req)?; + + Ok(serde_json::from_value(result)?) + } + fn ping(&self) -> Result<(), Error> { let req = Request::new_id( self.last_id.fetch_add(1, Ordering::SeqCst), diff --git a/src/types.rs b/src/types.rs index ce3ef9f..5ead20f 100644 --- a/src/types.rs +++ b/src/types.rs @@ -33,6 +33,8 @@ pub enum Param { Bool(bool), /// Bytes array parameter Bytes(Vec), + /// JSON parameter + Json(serde_json::Value), } #[derive(Serialize, Clone)]