rateLimit static method

Middleware rateLimit({
  1. int maxRequests = 100,
  2. Duration window = const Duration(minutes: 1),
  3. String keyGenerator(
    1. 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();
  };
}