From 1e855b2fd1d090d325e06cfd05311eb445bfc7ed Mon Sep 17 00:00:00 2001
From: Awiteb
Date: Thu, 20 Aug 2026 13:17:39 +0000
Subject: [PATCH] sdk(local_relay): `InnerLocalRelay::handle_connection` take
conn permit before handshake
I don't really think any relay use `handle_connection`, as I know all
of them use `handle_upgraded_connection`, which take an already upgraded
connection. But just in case a prodaction realy used it.
Pull-Request: https://github.com/nostrdevkit/nostr/pull/1458
Signed-off-by: Awiteb
Signed-off-by: Yuki Kishimoto
---
nostr-sdk/src/local_relay/local/inner.rs | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/nostr-sdk/src/local_relay/local/inner.rs b/nostr-sdk/src/local_relay/local/inner.rs
index a49036972..51b0d5102 100644
--- a/nostr-sdk/src/local_relay/local/inner.rs
+++ b/nostr-sdk/src/local_relay/local/inner.rs
@@ -303,7 +303,7 @@ impl InnerLocalRelay {
self,
raw_stream: S,
addr: SocketAddr,
- permit: OwnedSemaphorePermit,
+ handshake_permit: OwnedSemaphorePermit,
) -> Result<(), Error>
where
S: AsyncRead + AsyncWrite + Unpin,
@@ -312,6 +312,10 @@ impl InnerLocalRelay {
tokio::time::sleep(unresponsive_connection).await;
}
+ // Take the connection permit before doing the handshake
+ let conn_permit: OwnedSemaphorePermit =
+ self.connections_limit.clone().try_acquire_owned()?;
+
// Bound clients that open TCP but never complete the WebSocket handshake.
let ws_stream = tokio::time::timeout(
self.websocket_handshake_timeout,
@@ -324,12 +328,9 @@ impl InnerLocalRelay {
.map_err(Error::transport)?;
// The pre-handshake socket is no longer consuming admission resources.
- drop(permit);
-
- // An established connection only consumes a permit when explicitly configured.
- let permit = self.connections_limit.clone().try_acquire_owned()?;
+ drop(handshake_permit);
- self.handle_websocket(ws_stream, addr, permit).await?;
+ self.handle_websocket(ws_stream, addr, conn_permit).await?;
Ok(())
}