* chore: Add system wide rate limiting * Handle and convert HttpError to 429 * Make algo 32-bit to prevent <ES2020 error + fix sms manager unit test * Change core to common to go from 10 requests per minute to 200 * Remove redundant function * Fix integration tests * Make sure we allow all legal POST routes * Allow tRPC post calls * Add matcher tests on middleware * Add matcher tests on middleware * Fix matcher to not use regex * Fix missing POST allow rule for /api/auth/callback/credentials * Missed the api/book/event endpoints * Add missing pages/api routes * Remove POST middleware for now, very risky * Remove tests for POST protection --------- Co-authored-by: Volnei Munhoz <volnei.munhoz@gmail.com>
24 lines
779 B
TypeScript
24 lines
779 B
TypeScript
import { HttpError } from "./http-error";
|
|
import type { RateLimitHelper } from "./rateLimit";
|
|
import { rateLimiter } from "./rateLimit";
|
|
|
|
export async function checkRateLimitAndThrowError({
|
|
rateLimitingType = "core",
|
|
identifier,
|
|
onRateLimiterResponse,
|
|
opts,
|
|
}: RateLimitHelper) {
|
|
const response = await rateLimiter()({ rateLimitingType, identifier, opts });
|
|
if (onRateLimiterResponse) onRateLimiterResponse(response);
|
|
const { success, reset } = response;
|
|
if (!success) {
|
|
const convertToSeconds = (ms: number) => Math.floor(ms / 1000);
|
|
const secondsToWait = convertToSeconds(reset - Date.now());
|
|
throw new HttpError({
|
|
statusCode: 429,
|
|
message: `Rate limit exceeded. Try again in ${secondsToWait} seconds.`,
|
|
});
|
|
}
|
|
return response;
|
|
}
|