mirror of
https://github.com/wukko/cobalt.git
synced 2025-06-12 13:17:45 +02:00
api: add support for redis to ratelimiter cache
This commit is contained in:
@ -12,6 +12,7 @@ import { env, setTunnelPort } from "../config.js";
|
||||
import { extract } from "../processing/url.js";
|
||||
import { Green, Bright, Cyan } from "../misc/console-text.js";
|
||||
import { hashHmac } from "../security/secrets.js";
|
||||
import { createStore } from "../store/redis-ratelimit.js";
|
||||
import { randomizeCiphers } from "../misc/randomize-ciphers.js";
|
||||
import { verifyTurnstileToken } from "../security/turnstile.js";
|
||||
import { friendlyServiceName } from "../processing/service-alias.js";
|
||||
@ -40,7 +41,7 @@ const fail = (res, code, context) => {
|
||||
res.status(status).json(body);
|
||||
}
|
||||
|
||||
export const runAPI = (express, app, __dirname, isPrimary = true) => {
|
||||
export const runAPI = async (express, app, __dirname, isPrimary = true) => {
|
||||
const startTime = new Date();
|
||||
const startTimestamp = startTime.getTime();
|
||||
|
||||
@ -76,6 +77,7 @@ export const runAPI = (express, app, __dirname, isPrimary = true) => {
|
||||
standardHeaders: 'draft-6',
|
||||
legacyHeaders: false,
|
||||
keyGenerator,
|
||||
store: await createStore('session'),
|
||||
handler: handleRateExceeded
|
||||
});
|
||||
|
||||
@ -85,6 +87,7 @@ export const runAPI = (express, app, __dirname, isPrimary = true) => {
|
||||
standardHeaders: 'draft-6',
|
||||
legacyHeaders: false,
|
||||
keyGenerator: req => req.rateLimitKey || keyGenerator(req),
|
||||
store: await createStore('api'),
|
||||
handler: handleRateExceeded
|
||||
})
|
||||
|
||||
@ -94,6 +97,7 @@ export const runAPI = (express, app, __dirname, isPrimary = true) => {
|
||||
standardHeaders: 'draft-6',
|
||||
legacyHeaders: false,
|
||||
keyGenerator: req => req.rateLimitKey || keyGenerator(req),
|
||||
store: await createStore('tunnel'),
|
||||
handler: (_, res) => {
|
||||
return res.sendStatus(429)
|
||||
}
|
||||
|
19
api/src/store/redis-ratelimit.js
Normal file
19
api/src/store/redis-ratelimit.js
Normal file
@ -0,0 +1,19 @@
|
||||
import { env } from "../config.js";
|
||||
|
||||
let client, redis, redisLimiter;
|
||||
|
||||
export const createStore = async (name) => {
|
||||
if (!env.redisURL) return;
|
||||
|
||||
if (!client) {
|
||||
redis = await import('redis');
|
||||
redisLimiter = await import('rate-limit-redis');
|
||||
client = redis.createClient({ url: env.redisURL });
|
||||
await client.connect();
|
||||
}
|
||||
|
||||
return new redisLimiter.default({
|
||||
prefix: `RL${name}_`,
|
||||
sendCommand: (...args) => client.sendCommand(args),
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user