UNPKG

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
"use strict"; 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'); });