solver-sdk
Version:
SDK for WorkAI API - AI-powered code analysis with WorkCoins billing system
218 lines • 7.9 kB
JavaScript
"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