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:
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, ®istry)?;
sign_event::register(&mut m, ®istry)?;
session_status::register(&mut m, ®istry)?;
+ session_close::register(&mut m, ®istry)?;
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,