commit e2b57f62f094701d6d7d4bd006b4b138ba8ef883
parent 54b0573ea77c03dbfde9ceb21da8f9e540a18272
Author: triesap <tyson@radroots.org>
Date: Sat, 28 Mar 2026 22:55:25 +0000
bridge: report selectable signer capabilities
Diffstat:
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"));