express-rate-limiter-ts
Version:
A powerful, flexible and modern rate limiter middleware for Express.js written in TypeScript.
54 lines (53 loc) • 2.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = __importDefault(require("express"));
const express_rate_limiter_ts_1 = require("express-rate-limiter-ts");
const consola_1 = __importDefault(require("consola"));
const app = (0, express_1.default)();
// MemoryStore'u bir kez oluştur, hem rateLimiter'a hem admin paneline ver
const store = new express_rate_limiter_ts_1.MemoryStore(60000); // 1 dakika pencere
(0, express_rate_limiter_ts_1.startAdminPanel)(store); // Admin paneli (http://localhost:9222)
// Rate limiter middleware'i uygula
app.use((0, express_rate_limiter_ts_1.rateLimiter)({
windowMs: 60000, // 1 dakika pencere süresi
max: 5, // 1 dakikada en fazla 5 istek
message: { error: 'Çok fazla istek!' }, // Limit aşıldığında özel mesaj
stats: true, // İstatistik tutulsun
routes: {
'/api/special': {
max: 2, // /api/special için farklı limit
windowMs: 30000, // 30 saniyelik pencere
message: { error: 'Özel endpoint için limit aşıldı!' },
},
},
identifierType: 'header', // Limitleme anahtarı olarak header kullan
identifierHeader: 'x-api-key', // Hangi header?
whitelist: ['127.0.0.1'], // Bu IP limitsiz erişebilir
blacklist: (req) => req.header('x-api-key') === 'banned-key', // Bu key'e sahipler engellenir
customResponse: (req, res, info) => {
// Banlı veya limit aşımı durumunda özel yanıt
if (info.banned) {
res.status(429).json({ error: 'Banlandınız', banExpiresAt: info.banExpiresAt });
}
else if (info.exceeded) {
res.status(429).json({ error: 'Limit aşıldı', kalan: 0 });
}
},
banSeconds: 120, // Limit çok aşılırsa 2 dakika ban
dynamicMax: (req) => req.header('x-api-key') === 'premium' ? 20 : 5, // Premium kullanıcıya daha fazla hak
}, store));
// Genel API endpointi
app.get('/api', (_req, res) => {
res.json({ message: 'Genel API endpointi' });
});
// Özel endpoint (daha düşük limitli)
app.get('/api/special', (_req, res) => {
res.json({ message: 'Özel endpoint' });
});
// Sunucuyu başlat
app.listen(3000, () => {
consola_1.default.ready('Sunucu 3000 portunda çalışıyor');
});