From 5162e051ada1ba4a50b826d486680d48c924dcc8 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 7 Mar 2025 12:34:47 -0600 Subject: [PATCH] Ensure relay close handler is called --- packages/ditto/controllers/nostr/relay.ts | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/packages/ditto/controllers/nostr/relay.ts b/packages/ditto/controllers/nostr/relay.ts index 41ea6efd..f425305e 100644 --- a/packages/ditto/controllers/nostr/relay.ts +++ b/packages/ditto/controllers/nostr/relay.ts @@ -60,7 +60,7 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS .reduce((acc, limiter) => Math.min(acc, limiter.client(ip).remaining), Infinity); if (remaining < 0) { - socket.close(1008, 'Rate limit exceeded'); + closeSocket(1008, 'Rate limit exceeded'); return; } } @@ -74,7 +74,7 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS if (rateLimited(limiters.msg)) return; if (typeof e.data !== 'string') { - socket.close(1003, 'Invalid message'); + closeSocket(1003, 'Invalid message'); return; } @@ -95,13 +95,24 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS }; socket.onclose = () => { + handleSocketClose(); + }; + + // HACK: Due to a bug in Deno, we need to call the close handler manually. + // https://github.com/denoland/deno/issues/27924 + function closeSocket(code?: number, reason?: string): void { + socket.close(code, reason); + handleSocketClose(); + } + + function handleSocketClose() { connections.delete(socket); relayConnectionsGauge.set(connections.size); for (const controller of controllers.values()) { controller.abort(); } - }; + } function rateLimited(limiter: Pick): boolean { if (ip) { @@ -109,7 +120,7 @@ function connectStream(socket: WebSocket, ip: string | undefined, opts: ConnectS try { client.hit(); } catch { - socket.close(1008, 'Rate limit exceeded'); + closeSocket(1008, 'Rate limit exceeded'); return true; } }