solver-sdk
Version:
SDK для интеграции с Code Solver Backend API
219 lines • 10.9 kB
JavaScript
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