radrootsd

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

commit 31c079e490cbd3b0e4f0408ab4226518d20d5398
parent a826c67923d3fd8eee9e8b7fca3e1739ec6c3223
Author: triesap <tyson@radroots.org>
Date:   Wed,  8 Apr 2026 19:21:49 +0000

surface signer session in bridge job views

Diffstat:
Msrc/transport/jsonrpc/methods/bridge/shared.rs | 32+++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/src/transport/jsonrpc/methods/bridge/shared.rs b/src/transport/jsonrpc/methods/bridge/shared.rs @@ -32,6 +32,8 @@ pub(super) struct BridgeJobView { #[serde(default, skip_serializing_if = "Option::is_none")] pub completed_at_unix: Option<u64>, pub signer_mode: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub signer_session_id: Option<String>, pub event_kind: u32, #[serde(default, skip_serializing_if = "Option::is_none")] pub event_id: Option<String>, @@ -53,6 +55,7 @@ pub(super) struct BridgeJobView { impl From<BridgeJobRecord> for BridgeJobView { fn from(record: BridgeJobRecord) -> Self { + let (signer_mode, signer_session_id) = split_signer_usage(record.signer_mode.as_str()); Self { terminal: record.is_terminal(), recovered_after_restart: record.recovered_after_restart(), @@ -62,7 +65,8 @@ impl From<BridgeJobRecord> for BridgeJobView { status: record.status, requested_at_unix: record.requested_at_unix, completed_at_unix: record.completed_at_unix, - signer_mode: record.signer_mode, + signer_mode, + signer_session_id, event_kind: record.event_kind, event_id: record.event_id, event_addr: record.event_addr, @@ -79,6 +83,15 @@ impl From<BridgeJobRecord> for BridgeJobView { } } +fn split_signer_usage(value: &str) -> (String, Option<String>) { + match value.split_once(':') { + Some(("nip46_session", session_id)) if !session_id.trim().is_empty() => { + ("nip46_session".to_owned(), Some(session_id.to_owned())) + } + _ => (value.to_owned(), None), + } +} + pub(super) fn ensure_bridge_enabled(ctx: &RpcContext) -> Result<(), RpcError> { if !ctx.state.bridge_config.enabled { return Err(RpcError::Other("bridge ingress is disabled".to_string())); @@ -483,4 +496,21 @@ mod tests { assert!(view.terminal); assert!(view.recovered_after_restart); } + + #[test] + fn bridge_job_view_exposes_signer_session_separately() { + let job = new_listing_publish_job( + "job-1".to_string(), + Some("same".to_string()), + "nip46_session:session-1".to_string(), + 30402, + Some("event-1".to_string()), + "30402:author:listing".to_string(), + BridgeDeliveryPolicy::Any, + None, + ); + let view = BridgeJobView::from(job); + assert_eq!(view.signer_mode, "nip46_session"); + assert_eq!(view.signer_session_id.as_deref(), Some("session-1")); + } }