rateLimit static method
Middleware
rateLimit({
- int maxRequests = 100,
- Duration window = const Duration(minutes: 1),
- String keyGenerator(
- GliderRequest request
Implementation
static Middleware rateLimit({
int maxRequests = 100,
Duration window = const Duration(minutes: 1),
String Function(GliderRequest request)? keyGenerator,
}) {
final Map<String, List<DateTime>> requests = {};
final defaultKeyGenerator = (GliderRequest req) => req.clientIp ?? 'unknown';
final getKey = keyGenerator ?? defaultKeyGenerator;
return (request, next) async {
final key = getKey(request);
final now = DateTime.now();
final windowStart = now.subtract(window);
requests[key] = (requests[key] ?? [])
.where((time) => time.isAfter(windowStart))
.toList();
if (requests[key]!.length >= maxRequests) {
return GliderResponse(429)
.json({'error': 'Rate limit exceeded'});
}
requests[key]!.add(now);
return await next();
};
}