TS22 linhas889 bytes
apps/worker/src/services/rate-limit.ts
SHA-256
c476bcf914bcfd5a8dc6b1f418910734be2fac688285940bb5b7f8f36a66dab4
Somente leiturafonte-eb8a54281800
/**
* Rate limit simples em SQLite (tabela rate_limit_eventos). Os buckets usam
* pseudônimos (HMAC) de IP/e-mail; eventos com mais de 24h são apagados.
*/
import type { Env } from '../types'
const UM_DIA_MS = 24 * 60 * 60 * 1000
export async function contarEventos(env: Env, bucket: string, janelaMs: number): Promise<number> {
const row = await env.SENADO_DB.prepare(
`SELECT COUNT(*) AS n FROM rate_limit_eventos WHERE bucket = ? AND em > ?`,
).bind(bucket, Date.now() - janelaMs).first<{ n: number }>()
return Number(row?.n ?? 0)
}
export async function registrarEvento(env: Env, bucket: string): Promise<void> {
const agora = Date.now()
await env.SENADO_DB.prepare(`DELETE FROM rate_limit_eventos WHERE em < ?`).bind(agora - UM_DIA_MS).run()
await env.SENADO_DB.prepare(`INSERT INTO rate_limit_eventos (bucket, em) VALUES (?, ?)`).bind(bucket, agora).run()
}