solver-sdk
Version:
SDK for WorkAI API - AI-powered code analysis with WorkCoins billing system
200 lines • 6.87 kB
JavaScript
/**
* Централизованные классы ошибок 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