4466ba436b
## Description This PR ensures that the default prettier config is used for examples and templates. This config is compatible with `prettier@3` as well (upgrading prettier is bigger change that can be a future PR). ## Changes - Updated `.prettierrc.json` in root with `"trailingComma": "es5"` (will be needed upgrading to prettier@3) - Added `examples/.prettierrc.json` with default config (this will change every example) - Added `packages/create-next-app/templates/.prettierrc.json` with default config (this will change every template) ## Related - Fixes #54402 - Closes #54409
35 lines
1,000 B
TypeScript
35 lines
1,000 B
TypeScript
import type { NextApiResponse } from "next";
|
|
import { LRUCache } from "lru-cache";
|
|
|
|
type Options = {
|
|
uniqueTokenPerInterval?: number;
|
|
interval?: number;
|
|
};
|
|
|
|
export default function rateLimit(options?: Options) {
|
|
const tokenCache = new LRUCache({
|
|
max: options?.uniqueTokenPerInterval || 500,
|
|
ttl: options?.interval || 60000,
|
|
});
|
|
|
|
return {
|
|
check: (res: NextApiResponse, limit: number, token: string) =>
|
|
new Promise<void>((resolve, reject) => {
|
|
const tokenCount = (tokenCache.get(token) as number[]) || [0];
|
|
if (tokenCount[0] === 0) {
|
|
tokenCache.set(token, tokenCount);
|
|
}
|
|
tokenCount[0] += 1;
|
|
|
|
const currentUsage = tokenCount[0];
|
|
const isRateLimited = currentUsage >= limit;
|
|
res.setHeader("X-RateLimit-Limit", limit);
|
|
res.setHeader(
|
|
"X-RateLimit-Remaining",
|
|
isRateLimited ? 0 : limit - currentUsage,
|
|
);
|
|
|
|
return isRateLimited ? reject() : resolve();
|
|
}),
|
|
};
|
|
}
|