svelte-guardian
Version:
Batteries included authentication for SvelteKit applications.
49 lines (48 loc) • 1.89 kB
JavaScript
import { RedisRateLimiter } from './redis';
import { UpstashRedisRateLimiter } from './upstash-redis';
import { InMemoryRateLimiter } from './in-memory';
export class RateLimiterFactory {
static instance;
static create(config) {
// Check if rate limiting is disabled
if (config.enabled === false) {
return {
limit: async () => ({
allowed: true,
remaining: Number.MAX_SAFE_INTEGER,
resetTime: Date.now()
})
};
}
// Convert requestsPerMinute to existing configuration
if (config.requestsPerMinute !== undefined) {
config.maxRequests = config.requestsPerMinute;
config.windowMs = 60 * 1000; // 1 minute
}
// Ensure maxRequests is set
config.maxRequests = config.maxRequests || 10;
config.windowMs = config.windowMs || 60 * 1000;
// Use singleton pattern to reuse rate limiter
if (this.instance)
return this.instance;
switch (config.strategy || 'memory') {
case 'redis':
if (!config.redisConfig) {
throw new Error('Redis configuration is required for Redis strategy');
}
this.instance = new RedisRateLimiter(config.redisConfig);
break;
case 'upstash-redis':
if (!config.redisConfig) {
throw new Error('Redis configuration is required for Uostash Redis strategy');
}
this.instance = new UpstashRedisRateLimiter(config.redisConfig.url, config.redisConfig.token);
break;
case 'memory':
default:
this.instance = new InMemoryRateLimiter();
break;
}
return this.instance;
}
}