UNPKG

solver-sdk

Version:

SDK для интеграции с Code Solver Backend API (совместимо с браузером и Node.js), с поддержкой функциональности мышления (Thinking Mode)

284 lines 12.7 kB
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