UNPKG

solver-sdk

Version:

SDK для интеграции с Code Solver Backend API

219 lines 10.9 kB
import { WebSocketNamespace } from '../constants/websocket-namespaces.constants.js'; import { WebSocketEvents as WsEvents } from '../constants/websocket-events.constants.js'; import { BaseWebSocketClient } from './base-ws-client.js'; import { createIndexingConnectionParams } from '../utils/reasoning-auth-helper.js'; /** * WebSocket клиент для пространства имен индексации */ export class IndexingWebSocketClient extends BaseWebSocketClient { /** * Создает новый WebSocket клиент для индексации * @param {string} baseURL Базовый URL API * @param {IndexingWebSocketClientOptions} options Опции клиента */ constructor(baseURL, options = {}) { super(WebSocketNamespace.INDEXING, baseURL, options); /** ID активного проекта */ this.activeProjectId = null; // Инициализируем ID проекта, если указан this.activeProjectId = options.projectId || null; } /** * Подключается к серверу WebSocket * @param {boolean} autoJoin Автоматически присоединиться к проекту * @returns {Promise<boolean>} Успешность подключения */ async connectToIndexing(autoJoin = true) { try { this.logger.info('Подключение к пространству имен индексации', { projectId: this.activeProjectId }); // Получаем параметры для подключения с авторизацией const authParams = createIndexingConnectionParams(this.options.apiKey, this.activeProjectId, this.sessionManager.getSessionToken(this.namespace)); // Подключаемся к пространству имен индексации с передачей authToken const connected = await this.connect(authParams); if (!connected) { this.logger.error('Не удалось подключиться к пространству имен индексации'); return false; } // Аутентифицируемся с увеличенным таймаутом try { const authResult = await this.emitWithAck(WsEvents.AUTHENTICATE, { token: this.options.apiKey, projectId: this.activeProjectId }, 10000); this.logger.debug('Результат аутентификации в namespace индексации', authResult); // Если сервер вернул токен сессии, сохраняем его if (authResult.sessionToken) { this.sessionManager.saveSessionToken(this.namespace, authResult.sessionToken); } } catch (error) { this.logger.error('Ошибка аутентификации в namespace индексации', error); return false; } // Если у нас есть ID проекта и включено автоматическое присоединение if (this.activeProjectId && autoJoin) { return this.joinProject(this.activeProjectId); } return true; } catch (error) { this.logger.error('Ошибка подключения к пространству имен индексации', error); return false; } } /** * Присоединяется к проекту * @param {string} projectId ID проекта * @returns {Promise<boolean>} Успешность операции */ async joinProject(projectId) { if (!projectId) { this.logger.error('Попытка присоединиться к пустому projectId'); return false; } // Сохраняем ID проекта this.activeProjectId = projectId; try { // Отправляем запрос на присоединение к проекту const joinResult = await this.emitWithAck(WsEvents.JOIN_PROJECT, { projectId, token: this.options.apiKey }, 10000); this.logger.debug(`Результат присоединения к проекту ${projectId}`, joinResult); if (joinResult.success !== true) { this.logger.error(`Ошибка при присоединении к проекту: ${joinResult.error || 'Неизвестная ошибка'}`); return false; } return true; } catch (error) { this.logger.error(`Ошибка при присоединении к проекту ${projectId}`, error); return false; } } /** * Запускает процесс индексации проекта * @param {string} [projectId] ID проекта (если не указан, используется текущий проект) * @returns {Promise<boolean>} Успешность операции */ async startIndexing(projectId) { const targetId = projectId || this.activeProjectId; if (!targetId) { this.logger.error('Попытка запустить индексацию без указания ID проекта'); return false; } try { // Отправляем запрос на запуск индексации const startResult = await this.emitWithAck(WsEvents.START_INDEXING, { projectId: targetId, token: this.options.apiKey }, 10000); this.logger.debug(`Результат запуска индексации проекта ${targetId}`, startResult); if (startResult.success !== true) { this.logger.error(`Ошибка при запуске индексации: ${startResult.error || 'Неизвестная ошибка'}`); return false; } return true; } catch (error) { this.logger.error(`Ошибка при запуске индексации проекта ${targetId}`, error); return false; } } /** * Останавливает процесс индексации проекта * @param {string} [projectId] ID проекта (если не указан, используется текущий проект) * @returns {Promise<boolean>} Успешность операции */ async stopIndexing(projectId) { const targetId = projectId || this.activeProjectId; if (!targetId) { this.logger.error('Попытка остановить индексацию без указания ID проекта'); return false; } try { // Отправляем запрос на остановку индексации const stopResult = await this.emitWithAck(WsEvents.STOP_INDEXING, { projectId: targetId, token: this.options.apiKey }, 10000); this.logger.debug(`Результат остановки индексации проекта ${targetId}`, stopResult); if (stopResult.success !== true) { this.logger.error(`Ошибка при остановке индексации: ${stopResult.error || 'Неизвестная ошибка'}`); return false; } return true; } catch (error) { this.logger.error(`Ошибка при остановке индексации проекта ${targetId}`, error); return false; } } /** * Получает статус индексации проекта * @param {string} [projectId] ID проекта (если не указан, используется текущий проект) * @returns {Promise<any>} Статус индексации проекта */ async getIndexingStatus(projectId) { const targetId = projectId || this.activeProjectId; if (!targetId) { throw new Error('Не указан ID проекта для получения статуса индексации'); } try { // Отправляем запрос на получение статуса индексации const statusResult = await this.emitWithAck(WsEvents.GET_INDEXING_STATUS, { projectId: targetId, token: this.options.apiKey }, 10000); this.logger.debug(`Получен статус индексации проекта ${targetId}`, statusResult); return statusResult; } catch (error) { this.logger.error(`Ошибка при получении статуса индексации проекта ${targetId}`, error); throw error; } } /** * Устанавливает обработчик для события завершения индексации * @param {Function} handler Обработчик события */ onIndexingComplete(handler) { this.on('indexing_complete', handler); } /** * Устанавливает обработчик для события индексации файла * @param {Function} handler Обработчик события */ onFileIndexed(handler) { this.on('file_indexed', handler); } /** * Устанавливает обработчик для события ошибки индексации * @param {Function} handler Обработчик события */ onIndexingError(handler) { this.on('indexing_error', handler); } /** * Получает текущий ID активного проекта * @returns {string | null} ID активного проекта или null */ getActiveProjectId() { return this.activeProjectId; } /** * Устанавливает ID активного проекта * @param {string} projectId ID проекта * @returns {boolean} Успешность установки */ setActiveProjectId(projectId) { if (!projectId) { this.logger.error('Попытка установить пустой projectId'); return false; } this.activeProjectId = projectId; this.logger.debug(`Установлен активный projectId: ${projectId}`); return true; } } //# sourceMappingURL=indexing-ws-client.js.map