radrootsd

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

commit 933cc8d8874b242f10596e55366acedd8f9c0a2b
parent 5d65f2d29f9638190d3a7f2b2fb4811c4d9ecad6
Author: triesap <triesap@radroots.dev>
Date:   Tue,  6 Jan 2026 02:59:52 +0000

nip46: add session close rpc

- add nip46.session.close endpoint
- remove sessions from in-memory store
- return closed flag in response
- register close method in nip46 module

Diffstat:
Msrc/api/jsonrpc/methods/nip46/mod.rs | 2++
Asrc/api/jsonrpc/methods/nip46/session_close.rs | 34++++++++++++++++++++++++++++++++++
Msrc/nip46/session.rs | 5+++++
3 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/src/api/jsonrpc/methods/nip46/mod.rs b/src/api/jsonrpc/methods/nip46/mod.rs @@ -10,6 +10,7 @@ pub mod connect; pub mod get_public_key; pub mod sign_event; pub mod session_status; +pub mod session_close; pub fn module(ctx: RpcContext, registry: MethodRegistry) -> Result<RpcModule<RpcContext>> { let mut m = RpcModule::new(ctx); @@ -18,5 +19,6 @@ pub fn module(ctx: RpcContext, registry: MethodRegistry) -> Result<RpcModule<Rpc get_public_key::register(&mut m, &registry)?; sign_event::register(&mut m, &registry)?; session_status::register(&mut m, &registry)?; + session_close::register(&mut m, &registry)?; Ok(m) } diff --git a/src/api/jsonrpc/methods/nip46/session_close.rs b/src/api/jsonrpc/methods/nip46/session_close.rs @@ -0,0 +1,34 @@ +use anyhow::Result; +use jsonrpsee::server::RpcModule; +use serde::{Deserialize, Serialize}; + +use crate::api::jsonrpc::{MethodRegistry, RpcContext, RpcError}; + +#[derive(Debug, Deserialize)] +struct Nip46SessionCloseParams { + session_id: String, +} + +#[derive(Clone, Debug, Serialize)] +struct Nip46SessionCloseResponse { + session_id: String, + closed: bool, +} + +pub fn register(m: &mut RpcModule<RpcContext>, registry: &MethodRegistry) -> Result<()> { + registry.track("nip46.session.close"); + m.register_async_method("nip46.session.close", |params, ctx, _| async move { + let Nip46SessionCloseParams { session_id } = params + .parse() + .map_err(|e| RpcError::InvalidParams(e.to_string()))?; + let closed = ctx.state.nip46_sessions.remove(&session_id).await; + if !closed { + return Err(RpcError::InvalidParams("unknown session".to_string())); + } + Ok::<Nip46SessionCloseResponse, RpcError>(Nip46SessionCloseResponse { + session_id, + closed, + }) + })?; + Ok(()) +} diff --git a/src/nip46/session.rs b/src/nip46/session.rs @@ -44,6 +44,11 @@ impl Nip46SessionStore { sessions.get(session_id).cloned() } + pub async fn remove(&self, session_id: &str) -> bool { + let mut sessions = self.inner.lock().await; + sessions.remove(session_id).is_some() + } + pub async fn set_user_pubkey( &self, session_id: &str,