Iniciativa Cidadã Independente · Transparência Parlamentar
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()
}