nostr-websocket-utils
Version:
Robust WebSocket utilities for Nostr applications with automatic reconnection, supporting both ESM and CommonJS. Features channel-based messaging, heartbeat monitoring, message queueing, and comprehensive error handling with type-safe handlers.
86 lines • 2.81 kB
TypeScript
/**
* @file WebSocket Rate Limiter
* @module utils/rate-limiter
*/
import type { NostrWSMessage } from '../types/messages.js';
import type { Logger } from '../types/logger.js';
/**
* Rate limit configuration for different message types
*/
export interface RateLimitConfig {
windowMs: number;
maxRequests: number;
blockDurationMs?: number;
}
/**
* Client state for rate limiting
*/
interface ClientState {
requests: Map<string, number[]>;
blockedUntil?: number;
}
/**
* Rate limiter interface
*/
export interface RateLimiter {
shouldLimit(clientId: string, message: NostrWSMessage): Promise<boolean>;
recordRequest(clientId: string, message: NostrWSMessage): void;
getRemainingRequests(clientId: string, messageType: string): number;
isBlocked(clientId: string): boolean;
getClientState(clientId: string): ClientState;
}
/**
* Rate limit rules for different event types
*/
export declare const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig>;
/**
* Creates a rate limiter
* @param config - Rate limit configuration
* @param _logger - Logger instance
* @returns {RateLimiter} Rate limiter
*/
export declare function createRateLimiter(config: Record<string, RateLimitConfig> | undefined, _logger: Logger): RateLimiter;
/**
* WebSocket connection rate limiter interface
*/
export interface ConnectionRateLimiter {
/**
* Checks if a new connection should be allowed
* @param clientId - Client identifier
* @returns {Promise<boolean>} True if connection is allowed
*/
allowConnection(clientId: string): Promise<boolean>;
/**
* Records a connection attempt
* @param clientId - Client identifier
* @param successful - Whether connection was successful
*/
recordConnection(clientId: string, successful: boolean): void;
}
/**
* Creates a connection rate limiter
* @param config - Connection limit configuration
* @param logger - Logger instance
* @returns {ConnectionRateLimiter} Connection rate limiter
*/
export declare function createConnectionRateLimiter(config: {
maxConnectionsPerMinute: number;
maxConcurrentConnections: number;
blockAfterFailures: number;
blockDurationMs: number;
}, logger: Logger): ConnectionRateLimiter;
/**
* Rate limiter implementation
*/
export declare class RateLimiterImpl implements RateLimiter {
private clients;
private config;
constructor(config: RateLimitConfig);
getClientState(clientId: string): ClientState;
shouldLimit(clientId: string, message: NostrWSMessage): Promise<boolean>;
recordRequest(clientId: string, message: NostrWSMessage): void;
getRemainingRequests(clientId: string, messageType: string): number;
isBlocked(clientId: string): boolean;
}
export {};
//# sourceMappingURL=rate-limiter.d.ts.map