Upgrade socket before closing with 1008 (ratelimit)

This commit is contained in:
Alex Gleason 2025-02-20 00:23:06 -06:00
parent e2f23e51d2
commit f72fcdbd65
No known key found for this signature in database
GPG key ID: 7211D1F99744FBB7

View file

@ -45,6 +45,17 @@ const connections = new Set<WebSocket>();
function connectStream(socket: WebSocket, ip: string | undefined, conf: DittoConf) {
const controllers = new Map<string, AbortController>();
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);