dynamic-rate-limiter-middleware
Version:
Intelligent rate limiting middleware with MongoDB integration and caching for Node.js applications
201 lines (157 loc) • 4.74 kB
Markdown
# Dynamic Rate Limiter Middleware
An intelligent rate-limiting and caching middleware for Node.js applications that helps manage API calls to external services with rate limits. This middleware provides smart scheduling, caching, and monitoring capabilities to optimize API usage.
## Features
- 🚀 Intelligent rate limiting based on daily limits
- 💾 Built-in caching system with configurable TTL
- 📊 Traffic pattern analysis and smart scheduling
- 🔄 Automatic retry mechanism with exponential backoff
- 📈 Flexible MongoDB integration
- ⚡ In-memory caching for fast response times
- 🎯 Configurable for multiple APIs and endpoints
- 📝 Detailed logging and monitoring
## Installation
```bash
npm install dynamic-rate-limiter-middleware
```
## Quick Start
```javascript
const express = require('express');
const RateLimiterMiddleware = require('dynamic-rate-limiter-middleware');
const app = express();
// Initialize middleware with custom MongoDB configuration
const rateLimiter = await RateLimiterMiddleware({
maxHitsPerDay: 500,
baseUrl: 'https://api.example.com',
cacheTTL: 3600, // 1 hour in seconds
mongodb: {
url: 'mongodb://your-mongodb-url',
dbName: 'your-database-name',
options: {
// Additional MongoDB options
user: 'username',
pass: 'password'
}
}
});
// Apply middleware to specific routes
app.use('/api', rateLimiter);
```
## MongoDB Configuration
The middleware supports flexible MongoDB configuration:
```javascript
// Using environment variables (recommended)
const rateLimiter = await RateLimiterMiddleware({
mongodb: {
url: process.env.MONGODB_URI,
dbName: process.env.MONGODB_DB
}
});
// Using direct configuration
const rateLimiter = await RateLimiterMiddleware({
mongodb: {
url: 'mongodb://localhost:27017',
dbName: 'apiHits',
options: {
useNewUrlParser: true,
useUnifiedTopology: true,
user: 'username',
pass: 'password'
}
}
});
// Using existing mongoose connection
const mongoose = require('mongoose');
await mongoose.connect('mongodb://your-mongodb-url/dbname');
const rateLimiter = await RateLimiterMiddleware();
```
## Configuration Options
```javascript
const options = {
// Rate limiting
maxHitsPerDay: 500,
// External API configuration
baseUrl: 'https://api.example.com',
// Caching
cacheTTL: 3600, // seconds
// MongoDB configuration
mongodb: {
url: 'mongodb://localhost:27017',
dbName: 'apiHits',
options: {
useNewUrlParser: true,
useUnifiedTopology: true
}
},
// Traffic patterns
trafficPatterns: {
peakHours: {
start: 9, // 9 AM
end: 17 // 5 PM
},
hitDistribution: {
peak: 0.7, // 70% of hits during peak hours
offPeak: 0.3 // 30% during off-peak
}
},
// Retry configuration
retryAttempts: 3,
retryDelay: 1000 // milliseconds
};
```
## Environment Variables
The middleware supports the following environment variables:
```bash
MONGODB_URI=mongodb://localhost:27017
MONGODB_DB=apiHits
```
## Advanced Usage
### Manual MongoDB Initialization
```javascript
const { initializeMongoDB } = require('dynamic-rate-limiter-middleware');
// Initialize MongoDB connection manually
await initializeMongoDB({
url: 'mongodb://localhost:27017',
dbName: 'customDb',
options: {
// Your MongoDB options
}
});
```
### Custom Cache Implementation
```javascript
const { CacheManager } = require('dynamic-rate-limiter-middleware');
const cache = new CacheManager({
cacheTTL: 1800, // 30 minutes
});
```
### Traffic Pattern Analysis
```javascript
const { HitScheduler } = require('dynamic-rate-limiter-middleware');
const scheduler = new HitScheduler({
maxHitsPerDay: 1000,
trafficPatterns: {
peakHours: { start: 8, end: 18 }
}
});
```
## Error Handling
The middleware handles various error scenarios:
```javascript
try {
const rateLimiter = await RateLimiterMiddleware({
mongodb: {
url: 'invalid-url'
}
});
} catch (error) {
console.error('Failed to initialize middleware:', error);
}
```
## Best Practices
1. Use environment variables for MongoDB credentials
2. Set appropriate rate limits based on your API provider's constraints
3. Configure cache TTL based on data freshness requirements
4. Monitor analytics to optimize traffic patterns
5. Implement proper error handling in your application
## License
MIT License - see LICENSE file for details