@felixgeelhaar/govee-api-client
Version:
Enterprise-grade TypeScript client library for the Govee Developer REST API
68 lines • 2.59 kB
JavaScript
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