@superadnim/osint-mcp-server
Version:
Professional OSINT MCP Server for intelligence gathering with privacy protection
55 lines • 1.87 kB
JavaScript
;
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