UNPKG

@superadnim/osint-mcp-server

Version:

Professional OSINT MCP Server for intelligence gathering with privacy protection

55 lines 1.87 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RateLimiter = void 0; const bottleneck_1 = __importDefault(require("bottleneck")); class RateLimiter { limiters = new Map(); createLimiter(sourceId, config) { const limiter = new bottleneck_1.default({ maxConcurrent: config.concurrent, minTime: Math.ceil(60000 / config.requestsPerMinute), reservoir: config.requestsPerHour, reservoirRefreshAmount: config.requestsPerHour, reservoirRefreshInterval: 60 * 60 * 1000, // 1 hour }); this.limiters.set(sourceId, limiter); } async schedule(sourceId, fn) { const limiter = this.limiters.get(sourceId); if (!limiter) { throw new Error(`No rate limiter configured for source: ${sourceId}`); } return limiter.schedule(fn); } async getQueueSize(sourceId) { const limiter = this.limiters.get(sourceId); return limiter ? await limiter.queued() : 0; } async getPendingCount(sourceId) { const limiter = this.limiters.get(sourceId); return limiter ? await limiter.running() : 0; } async drain(sourceId) { const limiter = this.limiters.get(sourceId); if (limiter) { await limiter.stop(); } } clear(sourceId) { const limiter = this.limiters.get(sourceId); if (limiter) { limiter.stop(); this.limiters.delete(sourceId); } } clearAll() { for (const [sourceId] of this.limiters) { this.clear(sourceId); } } } exports.RateLimiter = RateLimiter; //# sourceMappingURL=rate-limiter.js.map