From 4783d2d9c61b47cff4cc26fd14e0c15a8b5557ea Mon Sep 17 00:00:00 2001 From: Chris Beck Date: Thu, 18 Dec 2025 15:21:44 -0700 Subject: [PATCH] move code out to a new signal-cli-jsonrpc-client this makes it easier to reuse the RPC stuff and the signal trust set stuff --- Cargo.toml | 3 ++ signal-cli-jsonrpc-client/Cargo.toml | 19 +++++++++++ signal-cli-jsonrpc-client/README.md | 32 +++++++++++++++++++ signal-cli-jsonrpc-client/src/lib.rs | 18 +++++++++++ .../src/rpc.rs | 4 +-- .../src/transports/ipc.rs | 0 .../src/transports/mod.rs | 0 .../src/transports/stream_codec.rs | 0 .../src/transports/tcp.rs | 0 .../src/trust_set.rs | 2 +- signal-gateway/Cargo.toml | 2 +- signal-gateway/src/gateway/mod.rs | 14 ++++---- signal-gateway/src/lib.rs | 2 -- 13 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 signal-cli-jsonrpc-client/Cargo.toml create mode 100644 signal-cli-jsonrpc-client/README.md create mode 100644 signal-cli-jsonrpc-client/src/lib.rs rename signal-gateway/src/signal_jsonrpc.rs => signal-cli-jsonrpc-client/src/rpc.rs (99%) rename {signal-gateway => signal-cli-jsonrpc-client}/src/transports/ipc.rs (100%) rename {signal-gateway => signal-cli-jsonrpc-client}/src/transports/mod.rs (100%) rename {signal-gateway => signal-cli-jsonrpc-client}/src/transports/stream_codec.rs (100%) rename {signal-gateway => signal-cli-jsonrpc-client}/src/transports/tcp.rs (100%) rename signal-gateway/src/gateway/signal_trust_set.rs => signal-cli-jsonrpc-client/src/trust_set.rs (99%) diff --git a/Cargo.toml b/Cargo.toml index 2320883..b526712 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,7 @@ resolver = "2" members = [ "prometheus-http-client", + "signal-cli-jsonrpc-client", "signal-gateway", "signal-gateway-code-tool", "signal-gateway-assistant", @@ -27,6 +28,7 @@ result_large_err = "allow" [workspace.dependencies] prometheus-http-client = { path = "prometheus-http-client", default-features = false } +signal-cli-jsonrpc-client = { path = "signal-cli-jsonrpc-client" } signal-gateway = { path = "signal-gateway", default-features = false } signal-gateway-assistant = { path = "signal-gateway-assistant" } signal-gateway-assistant-claude = { path = "signal-gateway-assistant/claude" } @@ -54,6 +56,7 @@ rand = "0.9" flate2 = "1" regex = "1" tar = "0.4" +prometheus-http-query = { version = "0.8", default-features = false } reqwest = { version = "0.12", default-features = false, features = ["json"] } serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/signal-cli-jsonrpc-client/Cargo.toml b/signal-cli-jsonrpc-client/Cargo.toml new file mode 100644 index 0000000..5406fcf --- /dev/null +++ b/signal-cli-jsonrpc-client/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "signal-cli-jsonrpc-client" +version = "0.1.0" +edition.workspace = true +description = "JSON-RPC client for signal-cli daemon" +license = "MIT OR Apache-2.0" + +[lints] +workspace = true + +[dependencies] +futures-util = { workspace = true } +jsonrpsee = { workspace = true } +serde = { workspace = true } +serde_json = { workspace = true } +thiserror = { workspace = true } +tokio = { workspace = true } +tokio-util = { workspace = true } +tracing = { workspace = true } diff --git a/signal-cli-jsonrpc-client/README.md b/signal-cli-jsonrpc-client/README.md new file mode 100644 index 0000000..f1bc9d9 --- /dev/null +++ b/signal-cli-jsonrpc-client/README.md @@ -0,0 +1,32 @@ +# signal-cli-jsonrpc-client + +A Rust JSON-RPC client for [signal-cli](https://github.com/AsamK/signal-cli) daemon. + +## Origin + +The RPC interface and transport code in this crate is based on the example client code from the signal-cli repository: + +- + +## Usage + +```rust +use signal_cli_jsonrpc_client::{connect_tcp, RpcClient}; + +// Connect to signal-cli daemon via TCP +let client = connect_tcp("127.0.0.1:7583").await?; + +// Use the RpcClient trait methods +let version = client.version().await?; +``` + +## Features + +- TCP transport for connecting to signal-cli daemon +- Unix domain socket transport (on Unix systems) +- Full RPC interface matching signal-cli's JSON-RPC API +- Helper types for sending messages and handling received messages + +## License + +MIT or Apache 2.0 at your option. diff --git a/signal-cli-jsonrpc-client/src/lib.rs b/signal-cli-jsonrpc-client/src/lib.rs new file mode 100644 index 0000000..d05fb53 --- /dev/null +++ b/signal-cli-jsonrpc-client/src/lib.rs @@ -0,0 +1,18 @@ +//! JSON-RPC client for signal-cli daemon. +//! +//! This crate provides a Rust client for communicating with [signal-cli](https://github.com/AsamK/signal-cli) +//! running in JSON-RPC daemon mode. It supports both TCP and Unix domain socket connections. +//! +//! The RPC interface and transport code is based on the example client code from the signal-cli repository: +//! + +mod rpc; +pub(crate) mod transports; +mod trust_set; + +pub use jsonrpsee::core::client::SubscriptionClientT; +pub use rpc::{ + DataMessage, Envelope, GroupInfo, Identity, JsonLink, MessageTarget, RecvMessage, RpcClient, + RpcClientError, SignalMessage, TrustLevel, connect_ipc, connect_tcp, +}; +pub use trust_set::{SafetyNumber, SignalTrustSet, Uuid}; diff --git a/signal-gateway/src/signal_jsonrpc.rs b/signal-cli-jsonrpc-client/src/rpc.rs similarity index 99% rename from signal-gateway/src/signal_jsonrpc.rs rename to signal-cli-jsonrpc-client/src/rpc.rs index 744821c..f08f6e5 100644 --- a/signal-gateway/src/signal_jsonrpc.rs +++ b/signal-cli-jsonrpc-client/src/rpc.rs @@ -468,7 +468,7 @@ pub struct Identity { pub async fn connect_tcp( tcp: impl ToSocketAddrs, ) -> Result { - let (sender, receiver) = super::transports::tcp::connect(tcp).await?; + let (sender, receiver) = crate::transports::tcp::connect(tcp).await?; Ok(ClientBuilder::default().build_with_tokio(sender, receiver)) } @@ -478,7 +478,7 @@ pub async fn connect_tcp( pub async fn connect_ipc( path: impl AsRef, ) -> Result { - let (sender, receiver) = super::transports::ipc::connect(path).await?; + let (sender, receiver) = crate::transports::ipc::connect(path).await?; Ok(ClientBuilder::default().build_with_tokio(sender, receiver)) } diff --git a/signal-gateway/src/transports/ipc.rs b/signal-cli-jsonrpc-client/src/transports/ipc.rs similarity index 100% rename from signal-gateway/src/transports/ipc.rs rename to signal-cli-jsonrpc-client/src/transports/ipc.rs diff --git a/signal-gateway/src/transports/mod.rs b/signal-cli-jsonrpc-client/src/transports/mod.rs similarity index 100% rename from signal-gateway/src/transports/mod.rs rename to signal-cli-jsonrpc-client/src/transports/mod.rs diff --git a/signal-gateway/src/transports/stream_codec.rs b/signal-cli-jsonrpc-client/src/transports/stream_codec.rs similarity index 100% rename from signal-gateway/src/transports/stream_codec.rs rename to signal-cli-jsonrpc-client/src/transports/stream_codec.rs diff --git a/signal-gateway/src/transports/tcp.rs b/signal-cli-jsonrpc-client/src/transports/tcp.rs similarity index 100% rename from signal-gateway/src/transports/tcp.rs rename to signal-cli-jsonrpc-client/src/transports/tcp.rs diff --git a/signal-gateway/src/gateway/signal_trust_set.rs b/signal-cli-jsonrpc-client/src/trust_set.rs similarity index 99% rename from signal-gateway/src/gateway/signal_trust_set.rs rename to signal-cli-jsonrpc-client/src/trust_set.rs index 70921b1..f63f2ac 100644 --- a/signal-gateway/src/gateway/signal_trust_set.rs +++ b/signal-cli-jsonrpc-client/src/trust_set.rs @@ -4,7 +4,7 @@ //! - Map: `{"uuid1": ["safety1", "safety2"], "uuid2": []}` - UUIDs with safety numbers //! - Sequence: `["uuid1", "uuid2"]` - UUIDs with no safety numbers (simpler) -use crate::signal_jsonrpc::{Envelope, Identity, RpcClient}; +use crate::{Envelope, Identity, RpcClient}; use serde::{ Deserialize, Deserializer, de::{MapAccess, SeqAccess, Visitor}, diff --git a/signal-gateway/Cargo.toml b/signal-gateway/Cargo.toml index d280701..04be8c6 100644 --- a/signal-gateway/Cargo.toml +++ b/signal-gateway/Cargo.toml @@ -13,6 +13,7 @@ rustls-tls = ["prometheus-http-client/rustls-tls", "reqwest/rustls-tls"] [dependencies] prometheus-http-client = { workspace = true, default-features = false } +signal-cli-jsonrpc-client = { workspace = true } signal-gateway-assistant = { workspace = true } async-trait = { workspace = true } @@ -22,7 +23,6 @@ conf-extra = { workspace = true } displaydoc = { workspace = true } futures-util = { workspace = true } humantime = { workspace = true } -jsonrpsee = { workspace = true } metrics = { workspace = true } regex = { workspace = true } reqwest = { workspace = true } diff --git a/signal-gateway/src/gateway/mod.rs b/signal-gateway/src/gateway/mod.rs index 38960ab..aabf99f 100644 --- a/signal-gateway/src/gateway/mod.rs +++ b/signal-gateway/src/gateway/mod.rs @@ -1,16 +1,11 @@ //! Gateway for bridging alerts and logs with Signal messenger. -#[cfg(unix)] -use crate::signal_jsonrpc::connect_ipc; use crate::{ alertmanager::AlertPost, assistant::{AssistantAgent, SentBy, Tool, ToolExecutor, ToolResult}, log_message::{LogMessage, Origin}, message_handler::{AdminMessage, AdminMessageResponse, Context, MessageHandlerResult}, prometheus::{Prometheus, PrometheusConfig}, - signal_jsonrpc::{ - Envelope, MessageTarget, RpcClient, RpcClientError, SignalMessage, connect_tcp, - }, }; use async_trait::async_trait; use chrono::Utc; @@ -18,6 +13,11 @@ use conf::{Conf, Subcommands}; use futures_util::FutureExt; use metrics::counter; use prometheus_http_client::{AlertStatus, ExtractLabels}; +#[cfg(unix)] +use signal_cli_jsonrpc_client::connect_ipc; +use signal_cli_jsonrpc_client::{ + Envelope, MessageTarget, RpcClient, RpcClientError, SignalMessage, connect_tcp, +}; use std::{ fmt::Write, net::SocketAddr, @@ -38,11 +38,9 @@ const METRIC_SIGNAL_RECEIVED: &str = "gateway_signal_messages_received_total"; const METRIC_SIGNAL_SENT: &str = "gateway_signal_messages_sent_total"; const METRIC_ALERTS: &str = "gateway_alerts_total"; -mod signal_trust_set; -pub use signal_trust_set::SignalTrustSet; - mod command_router; pub use command_router::{CommandRouter, CommandRouterBuilder, Handling}; +pub use signal_cli_jsonrpc_client::SignalTrustSet; mod log_buffer; mod log_handler; diff --git a/signal-gateway/src/lib.rs b/signal-gateway/src/lib.rs index ac5d1cc..8d8032c 100644 --- a/signal-gateway/src/lib.rs +++ b/signal-gateway/src/lib.rs @@ -19,8 +19,6 @@ pub(crate) mod log_format; pub(crate) mod log_message; pub(crate) mod prometheus; pub(crate) mod rate_limiter; -pub(crate) mod signal_jsonrpc; -pub(crate) mod transports; pub use gateway::{CommandRouter, CommandRouterBuilder, Gateway, GatewayConfig, Handling}; pub use limiter_sequence::Limit;