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(()) }