radrootsd

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

commit 5d65f2d29f9638190d3a7f2b2fb4811c4d9ecad6
parent 433f1b58b1d8dda29a8e020d891f21d6c73fb0ab
Author: triesap <triesap@radroots.dev>
Date:   Tue,  6 Jan 2026 02:54:21 +0000

nip46: add session status rpc

- add nip46.session.status endpoint
- return session pubkeys and relays
- include optional user pubkey
- register status method in nip46 module

Diffstat:
Msrc/api/jsonrpc/methods/nip46/mod.rs | 2++
Asrc/api/jsonrpc/methods/nip46/session_status.rs | 42++++++++++++++++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/src/api/jsonrpc/methods/nip46/mod.rs b/src/api/jsonrpc/methods/nip46/mod.rs @@ -9,6 +9,7 @@ pub mod status; pub mod connect; pub mod get_public_key; pub mod sign_event; +pub mod session_status; pub fn module(ctx: RpcContext, registry: MethodRegistry) -> Result<RpcModule<RpcContext>> { let mut m = RpcModule::new(ctx); @@ -16,5 +17,6 @@ pub fn module(ctx: RpcContext, registry: MethodRegistry) -> Result<RpcModule<Rpc connect::register(&mut m, &registry)?; get_public_key::register(&mut m, &registry)?; sign_event::register(&mut m, &registry)?; + session_status::register(&mut m, &registry)?; Ok(m) } diff --git a/src/api/jsonrpc/methods/nip46/session_status.rs b/src/api/jsonrpc/methods/nip46/session_status.rs @@ -0,0 +1,42 @@ +use anyhow::Result; +use jsonrpsee::server::RpcModule; +use serde::{Deserialize, Serialize}; + +use crate::api::jsonrpc::{MethodRegistry, RpcContext, RpcError}; + +#[derive(Debug, Deserialize)] +struct Nip46SessionStatusParams { + session_id: String, +} + +#[derive(Clone, Debug, Serialize)] +struct Nip46SessionStatusResponse { + session_id: String, + client_pubkey: String, + remote_signer_pubkey: String, + user_pubkey: Option<String>, + relays: Vec<String>, +} + +pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> { + registry.track("nip46.session.status"); + m.register_async_method("nip46.session.status", |params, ctx, _| async move { + let Nip46SessionStatusParams { session_id } = params + .parse() + .map_err(|e| RpcError::InvalidParams(e.to_string()))?; + let session = ctx + .state + .nip46_sessions + .get(&session_id) + .await + .ok_or_else(|| RpcError::InvalidParams("unknown session".to_string()))?; + Ok::<Nip46SessionStatusResponse, RpcError>(Nip46SessionStatusResponse { + session_id, + client_pubkey: session.client_pubkey.to_hex(), + remote_signer_pubkey: session.remote_signer_pubkey.to_hex(), + user_pubkey: session.user_pubkey.map(|pubkey| pubkey.to_hex()), + relays: session.relays, + }) + })?; + Ok(()) +}