UNPKG

tradestation-api-ts

Version:

A comprehensive TypeScript wrapper for TradeStation WebAPI v3

58 lines (57 loc) 1.97 kB
"use strict"; 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;