@zebec-network/zebec-stake-sdk
Version:
An SDK for zebec network stake solana program
58 lines (57 loc) • 1.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RateLimitedQueue = void 0;
class RateLimitedQueue {
queue = [];
running = 0;
maxConcurrent;
minDelay;
lastRequestTime = 0;
constructor(maxConcurrent = 3, minDelayMs = 200) {
this.maxConcurrent = maxConcurrent;
this.minDelay = minDelayMs;
}
async add(task) {
return new Promise((resolve, reject) => {
this.queue.push(async () => {
try {
// Ensure minimum delay between requests
const now = Date.now();
const timeSinceLastRequest = now - this.lastRequestTime;
if (timeSinceLastRequest < this.minDelay) {
await new Promise((resolve) => setTimeout(resolve, this.minDelay - timeSinceLastRequest));
}
this.lastRequestTime = Date.now();
const result = await task();
resolve(result);
}
catch (error) {
reject(error);
}
});
this.processQueue();
});
}
async processQueue() {
if (this.running >= this.maxConcurrent || this.queue.length === 0) {
return;
}
this.running++;
const task = this.queue.shift();
try {
await task();
}
finally {
this.running--;
this.processQueue(); // Process next item
}
}
// Test helper methods
getQueueLength() {
return this.queue.length;
}
getRunningCount() {
return this.running;
}
}
exports.RateLimitedQueue = RateLimitedQueue;