UNPKG

solver-sdk

Version:

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

218 lines 7.9 kB
"use strict"; /** * Централизованные классы ошибок SDK * Покрывают все типы ошибок backend с типизацией */ Object.defineProperty(exports, "__esModule", { value: true }); exports.RateLimitError = exports.LimitExceededError = exports.NetworkError = exports.TimeoutError = exports.DatabaseError = exports.GatewayTimeoutError = exports.ServiceUnavailableError = exports.InternalServerError = exports.BadRequestError = exports.ConflictError = exports.NotFoundError = exports.ValidationError = exports.ForbiddenError = exports.AuthenticationError = exports.BaseSDKError = void 0; /** * Базовый класс для всех SDK ошибок */ 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); } } } exports.BaseSDKError = BaseSDKError; // ======================================== // CLIENT ERRORS (4xx) // ======================================== /** * Ошибка аутентификации (401) * Выбрасывается при истекшем или невалидном access token */ class AuthenticationError extends BaseSDKError { constructor(message, details) { super(401, 'unauthorized', message, details); /** Можно ли повторить запрос после refresh токена */ this.shouldRetry = true; } } exports.AuthenticationError = AuthenticationError; /** * Ошибка доступа (403) * Выбрасывается когда доступ запрещен (не путать с LimitExceededError) */ class ForbiddenError extends BaseSDKError { constructor(message, details) { super(403, 'forbidden', message, details); this.reason = details?.reason; } } exports.ForbiddenError = ForbiddenError; /** * Ошибка валидации (422) * Выбрасывается при невалидных данных в запросе */ class ValidationError extends BaseSDKError { constructor(message, details) { super(422, 'validation_error', message, details); this.fields = details?.fields; } } exports.ValidationError = ValidationError; /** * Ресурс не найден (404) */ class NotFoundError extends BaseSDKError { constructor(message, details) { super(404, 'not_found', message, details); this.resource = details?.resource; } } exports.NotFoundError = NotFoundError; /** * Конфликт данных (409) * Выбрасывается при попытке создать дубликат или конфликтующую запись */ class ConflictError extends BaseSDKError { constructor(message, details) { super(409, 'conflict', message, details); } } exports.ConflictError = ConflictError; /** * Некорректный запрос (400) */ class BadRequestError extends BaseSDKError { constructor(message, details) { super(400, 'bad_request', message, details); } } exports.BadRequestError = BadRequestError; // ======================================== // SERVER ERRORS (5xx) // ======================================== /** * Внутренняя ошибка сервера (500) */ class InternalServerError extends BaseSDKError { constructor(message, details) { super(500, 'internal_server_error', message, details); } } exports.InternalServerError = InternalServerError; /** * Сервис недоступен (503) */ class ServiceUnavailableError extends BaseSDKError { constructor(message, details) { super(503, 'service_unavailable', message, details); this.retryAfter = details?.retryAfter; } } exports.ServiceUnavailableError = ServiceUnavailableError; /** * Таймаут gateway (504) */ class GatewayTimeoutError extends BaseSDKError { constructor(message, details) { super(504, 'gateway_timeout', message, details); } } exports.GatewayTimeoutError = GatewayTimeoutError; // ======================================== // СПЕЦИАЛЬНЫЕ ОШИБКИ // ======================================== /** * Ошибка базы данных * Выбрасывается при SQL ошибках или проблемах с БД */ class DatabaseError extends BaseSDKError { constructor(message, details) { super(400, 'database_error', message, details); } } exports.DatabaseError = DatabaseError; /** * Таймаут запроса (408) */ class TimeoutError extends BaseSDKError { constructor(message, details) { super(408, 'timeout_error', message, details); } } exports.TimeoutError = TimeoutError; /** * Ошибка сети * Выбрасывается когда запрос не смог достичь сервера */ class NetworkError extends BaseSDKError { constructor(message, details) { super(0, 'network_error', message, details); } } exports.NetworkError = NetworkError; // ======================================== // СУЩЕСТВУЮЩИЕ КЛАССЫ (обратная совместимость) // ======================================== /** * Ошибка превышения лимита кредитов (WorkCoins) * Выбрасывается при HTTP 403 с error.type === 'credits_limit_exceeded' */ 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; } } exports.LimitExceededError = LimitExceededError; /** * Ошибка превышения rate limit * Выбрасывается при HTTP 429 */ 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(); } } exports.RateLimitError = RateLimitError; //# sourceMappingURL=sdk-errors.js.map