radrootsd

JSON-RPC bridge for Radroots event publishing
git clone https://radroots.dev/git/radrootsd.git
Log | Files | Refs | README | LICENSE

commit e2b57f62f094701d6d7d4bd006b4b138ba8ef883
parent 54b0573ea77c03dbfde9ceb21da8f9e540a18272
Author: triesap <tyson@radroots.org>
Date:   Sat, 28 Mar 2026 22:55:25 +0000

bridge: report selectable signer capabilities

Diffstat:
Msrc/transport/jsonrpc/methods/bridge/status.rs | 24+++++++++++++++++++++++-
Msrc/transport/jsonrpc/methods/mod.rs | 18++++++++++++++++++
2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/transport/jsonrpc/methods/bridge/status.rs b/src/transport/jsonrpc/methods/bridge/status.rs @@ -3,15 +3,23 @@ use jsonrpsee::server::RpcModule; use serde::Serialize; use crate::app::config::BridgeDeliveryPolicy; +use crate::core::nip46::session::Nip46SessionRole; use crate::transport::jsonrpc::auth::{BRIDGE_AUTH_MODE, require_bridge_auth}; use crate::transport::jsonrpc::{MethodRegistry, RpcContext, RpcError}; +const BRIDGE_SIGNER_SELECTION_MODE: &str = "selectable_per_request"; +const BRIDGE_DEFAULT_SIGNER_MODE: &str = "embedded_service_identity"; +const BRIDGE_NIP46_SIGNER_MODE: &str = "nip46_session"; + #[derive(Clone, Debug, Serialize)] struct BridgeStatusResponse { enabled: bool, ready: bool, auth_mode: String, signer_mode: String, + default_signer_mode: String, + supported_signer_modes: Vec<String>, + available_nip46_signer_sessions: usize, relay_count: usize, delivery_policy: BridgeDeliveryPolicy, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -35,11 +43,25 @@ pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Res require_bridge_auth(&extensions)?; let relay_count = ctx.state.client.relays().await.len(); let snapshot = ctx.state.bridge_jobs.snapshot(); + let available_nip46_signer_sessions = ctx + .state + .nip46_sessions + .list() + .await + .into_iter() + .filter(|session| session.role() == Nip46SessionRole::OutboundRemoteSigner) + .count(); Ok::<BridgeStatusResponse, RpcError>(BridgeStatusResponse { enabled: ctx.state.bridge_config.enabled, ready: ctx.state.bridge_config.enabled && relay_count > 0, auth_mode: BRIDGE_AUTH_MODE.to_string(), - signer_mode: "embedded_service_identity".to_string(), + signer_mode: BRIDGE_SIGNER_SELECTION_MODE.to_string(), + default_signer_mode: BRIDGE_DEFAULT_SIGNER_MODE.to_string(), + supported_signer_modes: vec![ + BRIDGE_DEFAULT_SIGNER_MODE.to_string(), + BRIDGE_NIP46_SIGNER_MODE.to_string(), + ], + available_nip46_signer_sessions, relay_count, delivery_policy: ctx.state.bridge_config.delivery_policy, delivery_quorum: ctx.state.bridge_config.delivery_quorum, diff --git a/src/transport/jsonrpc/methods/mod.rs b/src/transport/jsonrpc/methods/mod.rs @@ -103,6 +103,24 @@ mod tests { .await .expect("request"); assert!(response.get().contains("\"auth_mode\":\"bearer_token\"")); + assert!( + response + .get() + .contains("\"signer_mode\":\"selectable_per_request\"") + ); + assert!( + response + .get() + .contains("\"default_signer_mode\":\"embedded_service_identity\"") + ); + assert!(response.get().contains( + "\"supported_signer_modes\":[\"embedded_service_identity\",\"nip46_session\"]" + )); + assert!( + response + .get() + .contains("\"available_nip46_signer_sessions\":0") + ); assert!(response.get().contains("\"accepted_jobs\":0")); assert!(response.get().contains("\"published_jobs\":0")); assert!(response.get().contains("\"failed_jobs\":0"));