UNPKG

solver-sdk

Version:

SDK for WorkAI API - AI-powered code analysis with WorkCoins billing system

200 lines 6.87 kB
/** * Централизованные классы ошибок SDK * Покрывают все типы ошибок backend с типизацией */ /** * Базовый класс для всех SDK ошибок */ export class BaseSDKError extends Error { constructor(statusCode, errorType, message, details) { super(message); this.name = this.constructor.name; this.statusCode = statusCode; this.errorType = errorType; this.requestId = details?.requestId; this.timestamp = details?.timestamp; this.rawResponse = details; // Поддержка stack trace в V8 if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } } } // ======================================== // CLIENT ERRORS (4xx) // ======================================== /** * Ошибка аутентификации (401) * Выбрасывается при истекшем или невалидном access token */ export class AuthenticationError extends BaseSDKError { constructor(message, details) { super(401, 'unauthorized', message, details); /** Можно ли повторить запрос после refresh токена */ this.shouldRetry = true; } } /** * Ошибка доступа (403) * Выбрасывается когда доступ запрещен (не путать с LimitExceededError) */ export class ForbiddenError extends BaseSDKError { constructor(message, details) { super(403, 'forbidden', message, details); this.reason = details?.reason; } } /** * Ошибка валидации (422) * Выбрасывается при невалидных данных в запросе */ export class ValidationError extends BaseSDKError { constructor(message, details) { super(422, 'validation_error', message, details); this.fields = details?.fields; } } /** * Ресурс не найден (404) */ export class NotFoundError extends BaseSDKError { constructor(message, details) { super(404, 'not_found', message, details); this.resource = details?.resource; } } /** * Конфликт данных (409) * Выбрасывается при попытке создать дубликат или конфликтующую запись */ export class ConflictError extends BaseSDKError { constructor(message, details) { super(409, 'conflict', message, details); } } /** * Некорректный запрос (400) */ export class BadRequestError extends BaseSDKError { constructor(message, details) { super(400, 'bad_request', message, details); } } // ======================================== // SERVER ERRORS (5xx) // ======================================== /** * Внутренняя ошибка сервера (500) */ export class InternalServerError extends BaseSDKError { constructor(message, details) { super(500, 'internal_server_error', message, details); } } /** * Сервис недоступен (503) */ export class ServiceUnavailableError extends BaseSDKError { constructor(message, details) { super(503, 'service_unavailable', message, details); this.retryAfter = details?.retryAfter; } } /** * Таймаут gateway (504) */ export class GatewayTimeoutError extends BaseSDKError { constructor(message, details) { super(504, 'gateway_timeout', message, details); } } // ======================================== // СПЕЦИАЛЬНЫЕ ОШИБКИ // ======================================== /** * Ошибка базы данных * Выбрасывается при SQL ошибках или проблемах с БД */ export class DatabaseError extends BaseSDKError { constructor(message, details) { super(400, 'database_error', message, details); } } /** * Таймаут запроса (408) */ export class TimeoutError extends BaseSDKError { constructor(message, details) { super(408, 'timeout_error', message, details); } } /** * Ошибка сети * Выбрасывается когда запрос не смог достичь сервера */ export class NetworkError extends BaseSDKError { constructor(message, details) { super(0, 'network_error', message, details); } } // ======================================== // СУЩЕСТВУЮЩИЕ КЛАССЫ (обратная совместимость) // ======================================== /** * Ошибка превышения лимита кредитов (WorkCoins) * Выбрасывается при HTTP 403 с error.type === 'credits_limit_exceeded' */ export class LimitExceededError extends BaseSDKError { constructor(errorData) { const message = errorData.message || errorData.details?.message || 'WorkCoins limit exceeded'; const errorType = errorData.type || 'credits_limit_exceeded'; super(403, errorType, message, errorData); this.statusType = errorData.details?.statusType || 'unknown'; this.status = errorData.details?.status || 'blocked'; this.details = errorData.details || {}; this.action = errorData.details?.action; this.balance = errorData.details?.balance; this.plan = errorData.details?.plan; } /** * Проверяет, заблокирован ли пользователь */ isBlocked() { return !this.details.canMakeRequest; } /** * Получает URL для действия пользователя */ getActionUrl() { return this.action?.url; } } /** * Ошибка превышения rate limit * Выбрасывается при HTTP 429 */ export class RateLimitError extends BaseSDKError { constructor(errorData) { const message = errorData.message || errorData.details?.message || 'Rate limit exceeded'; super(429, 'rate_limit_exceeded', message, errorData); this.details = errorData.details || {}; this.retryAfter = this.details.retryAfter || 60; // Парсим дату из ISO строки или используем текущее время + retryAfter this.retryAt = this.details.retryAt ? new Date(this.details.retryAt) : new Date(Date.now() + this.retryAfter * 1000); } /** * Получает время ожидания в миллисекундах */ getRetryDelayMs() { return Math.max(0, this.retryAt.getTime() - Date.now()); } /** * Проверяет, прошло ли время ожидания */ canRetryNow() { return Date.now() >= this.retryAt.getTime(); } } //# sourceMappingURL=sdk-errors.js.map