edge-master
Version:
A Micro Framework for Edges
79 lines (78 loc) • 2.26 kB
TypeScript
/// <reference types="@cloudflare/workers-types" />
import { IRequestInterceptor, InterceptorType } from '../types/interceptor';
export interface RateLimitOptions {
/**
* Maximum number of requests allowed in the window
* @default 100
*/
requests?: number;
/**
* Time window in milliseconds
* @default 60000 (1 minute)
*/
window?: number;
/**
* Function to generate a key for rate limiting (e.g., by IP, user ID)
* @default IP address from CF-Connecting-IP header
*/
keyGenerator?: (req: Request) => string;
/**
* Storage adapter for rate limit data
*/
storage?: RateLimitStorage;
/**
* Custom response when rate limit is exceeded
*/
onRateLimitExceeded?: (req: Request, resetTime: number) => Response;
}
export interface RateLimitStorage {
/**
* Get current request count and reset time for a key
*/
get(key: string): Promise<{
count: number;
resetTime: number;
} | null>;
/**
* Increment request count for a key
*/
increment(key: string, resetTime: number): Promise<{
count: number;
resetTime: number;
}>;
}
/**
* In-memory storage for rate limiting (for development/testing)
* Note: This is not suitable for production with multiple workers
*/
export declare class MemoryRateLimitStorage implements RateLimitStorage {
private storage;
get(key: string): Promise<{
count: number;
resetTime: number;
} | null>;
increment(key: string, resetTime: number): Promise<{
count: number;
resetTime: number;
}>;
}
/**
* KV-based storage for rate limiting (for Cloudflare Workers)
*/
export declare class KVRateLimitStorage implements RateLimitStorage {
private kv;
constructor(kv: KVNamespace);
get(key: string): Promise<any>;
increment(key: string, resetTime: number): Promise<any>;
}
/**
* Creates a rate limiting interceptor
*/
export declare function rateLimitInterceptor(options?: RateLimitOptions): IRequestInterceptor;
/**
* Response interceptor to add rate limit headers
*/
export declare function rateLimitHeadersInterceptor(): {
type: InterceptorType;
intercept(ctx: any): Promise<Response>;
};