tradestation-api-ts
Version:
A comprehensive TypeScript wrapper for TradeStation WebAPI v3
58 lines (57 loc) • 1.97 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.RateLimiter = void 0;
class RateLimiter {
constructor(defaultLimit = 120) {
this.defaultLimit = defaultLimit;
this.limits = new Map();
this.queues = new Map();
} // Default to 120 requests per minute
updateLimits(endpoint, headers) {
const limit = parseInt(String(headers['x-ratelimit-limit'] || this.defaultLimit));
const remaining = parseInt(String(headers['x-ratelimit-remaining'] || '0'));
const resetTime = parseInt(String(headers['x-ratelimit-reset'] || '0')) * 1000; // Convert to milliseconds
this.limits.set(endpoint, {
limit,
remaining,
resetTime,
});
}
async waitForSlot(endpoint) {
const queue = this.queues.get(endpoint) || [];
this.queues.set(endpoint, queue);
const currentLimit = this.limits.get(endpoint);
if (!currentLimit || currentLimit.remaining > 0) {
return;
}
const waitPromise = new Promise((resolve) => {
const timeToReset = currentLimit.resetTime - Date.now();
if (timeToReset > 0) {
setTimeout(resolve, timeToReset);
}
else {
resolve();
}
});
queue.push(waitPromise);
if (queue.length === 1) {
await waitPromise;
this.limits.set(endpoint, {
...currentLimit,
remaining: currentLimit.limit,
resetTime: Date.now() + 60000, // Reset in 1 minute
});
}
else {
await queue[queue.length - 2]; // Wait for previous request
}
queue.pop();
if (queue.length === 0) {
this.queues.delete(endpoint);
}
}
getRateLimit(endpoint) {
return this.limits.get(endpoint);
}
}
exports.RateLimiter = RateLimiter;