UNPKG

solver-sdk

Version:

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

203 lines 8.32 kB
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