diff --git a/packages/ditto/controllers/nostr/relay.ts b/packages/ditto/controllers/nostr/relay.ts index 9c29f89d..0284ce64 100644 --- a/packages/ditto/controllers/nostr/relay.ts +++ b/packages/ditto/controllers/nostr/relay.ts @@ -45,6 +45,17 @@ const connections = new Set(); function connectStream(socket: WebSocket, ip: string | undefined, conf: DittoConf) { const controllers = new Map(); + if (ip) { + const remaining = Object + .values(limiters) + .reduce((acc, limiter) => Math.min(acc, limiter.client(ip).remaining), Infinity); + + if (remaining < 0) { + socket.close(1008, 'Rate limit exceeded'); + return; + } + } + socket.onopen = () => { connections.add(socket); relayConnectionsGauge.set(connections.size); @@ -206,16 +217,6 @@ const relayController: AppController = (c, next) => { ip = undefined; } - if (ip) { - const remaining = Object - .values(limiters) - .reduce((acc, limiter) => Math.min(acc, limiter.client(ip).remaining), Infinity); - - if (remaining < 0) { - return c.json({ error: 'Rate limit exceeded' }, 429); - } - } - const { socket, response } = Deno.upgradeWebSocket(c.req.raw, { idleTimeout: 30 }); connectStream(socket, ip, conf);