UNPKG

@felixgeelhaar/govee-api-client

Version:

Enterprise-grade TypeScript client library for the Govee Developer REST API

68 lines 2.59 kB
import { GoveeApiClientError } from './GoveeApiClientError'; export class RateLimitError extends GoveeApiClientError { constructor(message, retryAfter, limit, remaining, resetTime, cause) { super(message, cause); this.code = 'RATE_LIMIT_EXCEEDED'; this.retryAfter = retryAfter; this.limit = limit; this.remaining = remaining; this.resetTime = resetTime; } static fromRateLimitResponse(headers) { const retryAfter = headers['retry-after'] ? parseInt(headers['retry-after'], 10) : undefined; const limit = headers['x-ratelimit-limit'] ? parseInt(headers['x-ratelimit-limit'], 10) : undefined; const remaining = headers['x-ratelimit-remaining'] ? parseInt(headers['x-ratelimit-remaining'], 10) : undefined; const resetTime = headers['x-ratelimit-reset'] ? new Date(parseInt(headers['x-ratelimit-reset'], 10) * 1000) : undefined; let message = 'Rate limit exceeded'; if (retryAfter) { message += `. Retry after ${retryAfter} seconds`; } if (resetTime) { message += `. Rate limit resets at ${resetTime.toISOString()}`; } return new RateLimitError(message, retryAfter, limit, remaining, resetTime); } getRetryAfterMs() { if (this.retryAfter) { return this.retryAfter * 1000; } if (this.resetTime) { return Math.max(0, this.resetTime.getTime() - Date.now()); } return 60000; // Default to 1 minute } canRetry() { return this.retryAfter !== undefined || this.resetTime !== undefined; } getRecommendation() { const retryMs = this.getRetryAfterMs(); const retrySeconds = Math.ceil(retryMs / 1000); return `Wait ${retrySeconds} seconds before making another request. Consider implementing exponential backoff for automatic retries.`; } toObject() { const obj = { ...super.toObject(), recommendation: this.getRecommendation(), }; if (this.retryAfter !== undefined) { obj.retryAfter = this.retryAfter; } if (this.limit !== undefined) { obj.limit = this.limit; } if (this.remaining !== undefined) { obj.remaining = this.remaining; } if (this.resetTime !== undefined) { obj.resetTime = this.resetTime.toISOString(); } return obj; } } //# sourceMappingURL=RateLimitError.js.map