solver-sdk
Version:
SDK для интеграции с Code Solver Backend API
203 lines • 8.32 kB
TypeScript
import { BaseWebSocketClient } from './base-ws-client';
/**
* Опции для клиента файловой системы
*/
export interface FileSystemWsClientOptions {
/** Обработчик чтения файла */
onReadFile?: (path: string) => Promise<string>;
/** Обработчик получения списка файлов */
onListFiles?: (directory: string, options?: {
includePatterns?: string[];
excludePatterns?: string[];
}) => Promise<FileInfo[]>;
/** Обработчик начала отслеживания файлов */
onWatchStart?: (patterns: string[]) => Promise<boolean>;
}
/**
* Интерфейс информации о файле
*/
export interface FileInfo {
/** Абсолютный путь к файлу */
path: string;
/** Относительный путь в рамках проекта */
relativePath: string;
/** Расширение файла */
extension: string;
/** Размер файла в байтах */
size: number;
/** Флаг директории */
isDirectory: boolean;
}
/**
* Клиент WebSocket для работы с файловой системой
*/
export declare class FileSystemWsClient extends BaseWebSocketClient {
private sessionId;
private projectId;
private pingInterval;
private pingTimer;
private readonly SDK_VERSION;
onReadFile: (path: string) => Promise<string>;
onListFiles: (directory: string, options?: {
includePatterns?: string[];
excludePatterns?: string[];
}) => Promise<FileInfo[]>;
onWatchStart: (patterns: string[]) => Promise<boolean>;
/**
* Создает новый клиент для работы с файловой системой
* @param baseURL Базовый URL API
* @param options Опции клиента
*/
constructor(baseURL: string, options?: FileSystemWsClientOptions);
/**
* Подключение к серверу и инициализация сессии
* @param params Параметры подключения (может содержать projectId или другие параметры)
* @returns Promise<boolean> Успешность подключения
*/
connect(params?: Record<string, any>): Promise<boolean>;
/**
* Подключение к проекту - удобный метод для использования в приложении
* @param projectId ID проекта
* @returns Promise<boolean> Успешность подключения
*/
connectToProject(projectId: string): Promise<boolean>;
/**
* Настройка обработчиков событий
*/
private setupHandlers;
/**
* Уведомляет сервер об изменении файла
* @param path Путь к файлу
* @param changeType Тип изменения
*/
notifyFileChanged(path: string, changeType?: 'created' | 'modified' | 'deleted'): boolean;
}
/**
* Пример использования клиента файловой системы в VS Code расширении:
*
* ```typescript
* import * as vscode from 'vscode';
* import { FileSystemWsClient } from 'solver-sdk';
*
* export function activate(context: vscode.ExtensionContext) {
* // Создание клиента файловой системы
* const fsClient = new FileSystemWsClient('wss://your-backend-url.com', {
* // Обработчик чтения файла
* onReadFile: async (path) => {
* try {
* const uri = vscode.Uri.file(path);
* const content = await vscode.workspace.fs.readFile(uri);
* return new TextDecoder().decode(content);
* } catch (error) {
* throw new Error(`Ошибка чтения файла: ${error.message}`);
* }
* },
*
* // Обработчик получения списка файлов
* onListFiles: async (directory, options) => {
* try {
* // Получаем корневую директорию рабочего пространства
* const rootPath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath;
* if (!rootPath) throw new Error('Не найдено рабочее пространство');
*
* // Формируем паттерн для поиска файлов
* const pattern = new vscode.RelativePattern(
* rootPath,
* options?.includePatterns?.[0] || '**'
* );
*
* // Находим файлы по паттерну
* const files = await vscode.workspace.findFiles(pattern,
* options?.excludePatterns?.join('|')
* );
*
* // Преобразуем результаты в нужный формат
* return files.map(uri => {
* const relativePath = vscode.workspace.asRelativePath(uri);
* const stats = fs.statSync(uri.fsPath);
*
* return {
* path: uri.fsPath,
* relativePath,
* extension: uri.fsPath.split('.').pop() || '',
* size: stats.size,
* isDirectory: stats.isDirectory()
* };
* });
* } catch (error) {
* throw new Error(`Ошибка получения списка файлов: ${error.message}`);
* }
* },
*
* // Обработчик отслеживания файлов
* onWatchStart: async (patterns) => {
* try {
* // Создаем наблюдателей за файлами
* const watchers = patterns.map(pattern => {
* const watcher = vscode.workspace.createFileSystemWatcher(
* new vscode.RelativePattern(
* vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || '',
* pattern
* )
* );
*
* // Обработчик изменения файла
* watcher.onDidChange(uri => {
* const relativePath = vscode.workspace.asRelativePath(uri);
* fsClient.notifyFileChanged(relativePath, 'modified');
* });
*
* // Обработчик создания файла
* watcher.onDidCreate(uri => {
* const relativePath = vscode.workspace.asRelativePath(uri);
* fsClient.notifyFileChanged(relativePath, 'created');
* });
*
* // Обработчик удаления файла
* watcher.onDidDelete(uri => {
* const relativePath = vscode.workspace.asRelativePath(uri);
* fsClient.notifyFileChanged(relativePath, 'deleted');
* });
*
* return watcher;
* });
*
* // Добавляем наблюдателей в контекст расширения для правильной очистки
* watchers.forEach(watcher => {
* context.subscriptions.push(watcher);
* });
*
* return true;
* } catch (error) {
* console.error('Ошибка при настройке отслеживания файлов:', error);
* return false;
* }
* }
* });
*
* // Подключаемся к проекту
* vscode.commands.registerCommand('extension.connectToProject', async () => {
* // Запрашиваем ID проекта у пользователя
* const projectId = await vscode.window.showInputBox({
* prompt: 'Введите ID проекта для подключения'
* });
*
* if (!projectId) return;
*
* try {
* // Устанавливаем соединение
* const connected = await fsClient.connectToProject(projectId);
*
* if (connected) {
* vscode.window.showInformationMessage(`Успешное подключение к проекту ${projectId}`);
* } else {
* vscode.window.showErrorMessage('Ошибка подключения к проекту');
* }
* } catch (error) {
* vscode.window.showErrorMessage(`Ошибка: ${error.message}`);
* }
* });
* }
* ```
*/
//# sourceMappingURL=filesystem-ws-client.d.ts.map