solver-sdk
Version:
SDK для интеграции с Code Solver Backend API (совместимо с браузером и Node.js), с поддержкой функциональности мышления (Thinking Mode)
284 lines • 12.7 kB
JavaScript
import { WebSocketNamespace } from '../utils/code-solver-websocket-client.js';
/**
* API для работы с зависимостями файлов в проектах
*/
export class DependenciesApi {
/**
* Создает новый экземпляр API для работы с зависимостями
* @param httpClient HTTP клиент для запросов к API
*/
constructor(httpClient) {
/** WebSocket клиент */
this.wsClient = null;
/** Родительский SDK */
this.parentSdk = null;
this.client = httpClient;
this.baseUrl = '/dependencies';
}
/**
* Получает зависимости конкретного файла
* @param projectId ID проекта
* @param params Параметры запроса зависимостей файла
* @returns Зависимости файла
*/
async getFileDependencies(projectId, params) {
try {
const response = await this.client.get(`/projects/${projectId}/dependencies/file`, { params: { path: params.filePath } });
if (!response.success || !response.data) {
throw new Error(response.error || 'Ошибка при получении зависимостей файла');
}
return response.data;
}
catch (error) {
throw new Error(`Ошибка при получении зависимостей файла: ${error.message}`);
}
}
/**
* Получает граф зависимостей проекта
* @param projectId ID проекта
* @returns Граф зависимостей
*/
async getDependencyGraph(projectId) {
try {
const response = await this.client.get(`/projects/${projectId}/dependencies/graph`);
if (!response.success || !response.data) {
throw new Error(response.error || 'Ошибка при получении графа зависимостей');
}
return response.data;
}
catch (error) {
throw new Error(`Ошибка при получении графа зависимостей: ${error.message}`);
}
}
/**
* Получает статистику зависимостей проекта
* @param projectId ID проекта
* @returns Статистика зависимостей
*/
async getDependencyStatistics(projectId) {
try {
const response = await this.client.get(`/projects/${projectId}/dependencies/stats`);
if (!response.success || !response.data) {
throw new Error(response.error || 'Ошибка при получении статистики зависимостей');
}
return response.data;
}
catch (error) {
throw new Error(`Ошибка при получении статистики зависимостей: ${error.message}`);
}
}
/**
* Получает детальную информацию о файле
* @param projectId ID проекта
* @param filePath Путь к файлу
* @returns Информация о файле
*/
async getFileDetails(projectId, filePath) {
try {
const response = await this.client.get(`/projects/${projectId}/dependencies/file-details`, { params: { path: filePath } });
if (!response.success || !response.data) {
throw new Error(response.error || 'Ошибка при получении информации о файле');
}
return response.data;
}
catch (error) {
throw new Error(`Ошибка при получении информации о файле: ${error.message}`);
}
}
/**
* Получает связанные компоненты для файла
* @param projectId ID проекта
* @param params Параметры запроса связанных компонентов
* @returns Связанные компоненты
*/
async getRelatedComponents(projectId, params) {
try {
const response = await this.client.get(`/projects/${projectId}/dependencies/related`, {
params: {
path: params.filePath,
maxDepth: params.maxDepth || 3,
includeIncoming: params.includeIncoming || true,
includeOutgoing: params.includeOutgoing || true,
maxNodes: params.maxNodes || 20
}
});
if (!response.success || !response.data) {
throw new Error(response.error || 'Ошибка при получении связанных компонентов');
}
return response.data;
}
catch (error) {
throw new Error(`Ошибка при получении связанных компонентов: ${error.message}`);
}
}
/**
* Анализирует граф зависимостей проекта
* @param projectId ID проекта
* @returns Результат анализа
*/
async analyzeDependencyGraph(projectId) {
try {
const response = await this.client.get(`/projects/${projectId}/dependencies/analyze`);
if (!response.success || !response.data) {
throw new Error(response.error || 'Ошибка при анализе графа зависимостей');
}
return response.data;
}
catch (error) {
throw new Error(`Ошибка при анализе графа зависимостей: ${error.message}`);
}
}
/**
* Присоединяется к проекту через WebSocket
* @param projectId ID проекта
* @param wsClient WebSocket клиент (опционально)
* @returns {Promise<{success: boolean, projectId: string, error?: string}>} Результат операции
*/
async joinProject(projectId, wsClient) {
try {
// Если WebSocket клиент не передан, попробуем получить его из родительского SDK
const client = wsClient || this._parent?.getWebSocketClient?.();
if (!client) {
throw new Error('WebSocket клиент не доступен');
}
// Убедимся, что клиент подключен к пространству имен dependencies
const isConnected = await client.isConnected(WebSocketNamespace.DEPENDENCIES);
if (!isConnected) {
await client.connect(WebSocketNamespace.DEPENDENCIES);
}
// Отправляем событие присоединения к проекту
const result = await client.emitWithAck(WebSocketNamespace.DEPENDENCIES, 'join_dependencies', {
projectId
});
return {
success: true,
projectId,
...result
};
}
catch (error) {
console.error(`[DependenciesAPI] Ошибка при присоединении к проекту: ${error.message}`);
return {
success: false,
projectId,
error: error.message
};
}
}
/**
* Подключается к WebSocket для событий зависимостей
* @returns {Promise<boolean>} Результат подключения
*/
async connectWebSocket() {
try {
if (!this.parentSdk || typeof this.parentSdk.getWebSocketClient !== 'function') {
throw new Error('Родительский SDK не настроен или не поддерживает WebSocket');
}
this.wsClient = this.parentSdk.getWebSocketClient();
await this.wsClient.connect(WebSocketNamespace.DEPENDENCIES);
return this.wsClient.isConnected(WebSocketNamespace.DEPENDENCIES);
}
catch (error) {
console.error('[DependenciesApi] Ошибка при подключении к WebSocket:', error.message);
return false;
}
}
/**
* Отключается от WebSocket для событий зависимостей
* @returns {Promise<void>}
*/
async disconnectWebSocket() {
if (this.wsClient) {
await this.wsClient.disconnect(WebSocketNamespace.DEPENDENCIES);
}
}
/**
* Проверяет, подключен ли WebSocket
* @returns {boolean} Состояние подключения
*/
isWebSocketConnected() {
return this.wsClient ? this.wsClient.isConnected(WebSocketNamespace.DEPENDENCIES) : false;
}
/**
* Устанавливает родительский SDK
* @param sdk Родительский SDK
*/
setParent(sdk) {
this.parentSdk = sdk;
}
/**
* Подписывается на событие через WebSocket
* @param event Название события
* @param callback Функция обратного вызова
*/
on(event, callback) {
if (!this.wsClient) {
console.warn('[DependenciesApi] WebSocket не подключен');
return;
}
this.wsClient.on(event, callback);
}
/**
* Отправляет событие через WebSocket
* @param event Название события
* @param data Данные для отправки
*/
emitSocketEvent(event, data) {
if (!this.wsClient) {
console.warn('[DependenciesApi] WebSocket не подключен');
return;
}
this.wsClient.send(WebSocketNamespace.DEPENDENCIES, event, data);
}
/**
* Отправляет событие через WebSocket с ожиданием ответа
* @param event Имя события
* @param data Данные для отправки
* @param timeout Таймаут ожидания ответа
* @returns {Promise<any>} Ответ от сервера
*/
async sendSocketEventWithResponse(event, data, timeout = 5000) {
if (!this.wsClient) {
throw new Error('[DependenciesApi] WebSocket не подключен');
}
// Реализуем собственный механизм emitWithAck, если wsClient не поддерживает его
return new Promise((resolve, reject) => {
try {
// Создаем уникальный ID для запроса
const requestId = `req_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
// Имя события для ответа
const responseEvent = `${event}_response`;
// Обработчик для получения ответа
const responseHandler = (response) => {
if (response && response.requestId === requestId) {
// Очищаем таймер и удаляем обработчик
clearTimeout(timeoutId);
if (this.wsClient) {
this.wsClient.off(responseEvent, responseHandler);
}
// Разрешаем промис с ответом
resolve(response.data || response);
}
};
// Устанавливаем таймаут
const timeoutId = setTimeout(() => {
if (this.wsClient) {
this.wsClient.off(responseEvent, responseHandler);
}
reject(new Error(`Таймаут ожидания ответа на событие ${event}`));
}, timeout);
// Регистрируем обработчик
this.wsClient.on(responseEvent, responseHandler);
// Отправляем событие
this.wsClient.send(WebSocketNamespace.DEPENDENCIES, event, {
...data,
requestId
});
}
catch (error) {
reject(error);
}
});
}
}
//# sourceMappingURL=dependencies-api.js.map