solver-sdk
Version:
SDK for WorkAI API - AI-powered code analysis with WorkCoins billing system
220 lines • 8.02 kB
TypeScript
/**
* 🔌 Project Sync WebSocket Client
*
* Клиент для работы с real-time уведомлениями о статусе синхронизации проектов.
* Интегрируется с backend ProjectSyncGateway через Socket.io.
*
* @features
* - Real-time push notifications о статусе индексации
* - Auto-reconnection при разрыве соединения
* - Graceful fallback к REST polling
* - TypeScript поддержка для всех событий
*/
export interface JoinProjectSyncDto {
projectId: string;
userId?: string;
}
export interface SyncStatusUpdate {
projectId: string;
sessionId: string;
status: 'initializing' | 'processing' | 'completed' | 'failed' | 'cancelled';
progress?: number;
message?: string;
timestamp: Date;
chunksProcessed?: number;
totalChunks?: number;
embeddingsCreated?: number;
}
export interface SyncProgressEvent {
projectId: string;
sessionId: string;
stage: 'receiving_chunks' | 'processing_chunks' | 'creating_embeddings' | 'updating_tree' | 'finalizing';
progress: number;
currentChunk?: number;
totalChunks?: number;
processedFiles?: number;
totalFiles?: number;
estimatedTimeRemaining?: number;
details?: string;
}
export interface SyncCompletedEvent {
projectId: string;
sessionId: string;
status: 'success' | 'failed' | 'cancelled';
totalProcessed: number;
duration: number;
errors?: string[];
warnings?: string[];
statistics?: {
filesIndexed: number;
embeddingsCreated: number;
chunksProcessed: number;
totalSize: number;
totalFiles?: number;
};
}
export interface ErrorEvent {
projectId: string;
sessionId?: string;
error: string;
code: string;
timestamp: Date;
recoverable: boolean;
}
export type SyncEventHandler<T> = (data: T) => void;
/**
* Типы событий WebSocket (синхронизированы с backend ProjectSyncGateway)
*
* Backend → Client:
* - 'connected' - успешное подключение к gateway
* - 'disconnected' - отключение от gateway (SDK-only, внутреннее)
* - 'project-sync-joined' - успешная подписка на проект
* - 'project-sync-left' - успешная отписка от проекта
* - 'sync-status-update' - обновление статуса синхронизации
* - 'sync-progress' - прогресс синхронизации
* - 'sync-completed' - завершение синхронизации
* - 'error' - ошибки (IP_CONNECTIONS_EXCEEDED, INVALID_PROJECT_ID, etc.)
* - 'disconnect-idle' - принудительное отключение по idle timeout
* - 'reconnect_exhausted' - SDK-only: исчерпаны попытки reconnect
*/
export type EventType = 'sync-status-update' | 'sync-progress' | 'sync-completed' | 'error' | 'connected' | 'disconnected' | 'project-sync-joined' | 'project-sync-left' | 'disconnect-idle' | 'reconnect_exhausted';
/** Событие при успешном join на проект (от backend) */
export interface ProjectSyncJoinedEvent {
projectId: string;
message: string;
connectedClients: number;
timestamp: Date;
}
/** Событие при leave проекта (от backend) */
export interface ProjectSyncLeftEvent {
projectId: string;
message: string;
timestamp: Date;
}
/** Событие при принудительном отключении по idle timeout */
export interface DisconnectIdleEvent {
reason: string;
idleTime: number;
maxIdleTime: number;
timestamp: Date;
}
/** Событие при исчерпании попыток reconnect (SDK-only) */
export interface ReconnectExhaustedEvent {
attempts: number;
maxAttempts: number;
lastError?: string;
timestamp: Date;
}
/**
* Опции для ProjectSyncClient
*/
export interface ProjectSyncClientOptions {
/** Базовый URL backend сервера */
baseURL: string;
/** Заголовки аутентификации (статические) */
headers?: Record<string, string>;
/** Динамическое получение токена авторизации */
getAuthToken?: () => Promise<string | null>;
/** Таймаут подключения (мс) */
connectionTimeout?: number;
/** Максимальное количество попыток переподключения */
maxRetries?: number;
/** Задержка между попытками переподключения (мс) */
retryDelay?: number;
/** Включить отладочные логи (deprecated: используйте logLevel) */
debug?: boolean;
/**
* 🔄 Полностью отключить auto-reconnect в SDK
* Рекомендуется при использовании собственного координатора reconnect на клиенте
*/
disableAutoReconnect?: boolean;
/**
* 📝 Уровень логирования для WebSocket
* - 'silent' - полностью отключает логирование
* - 'error' - только ошибки (по умолчанию)
* - 'warn' - предупреждения и ошибки
* - 'info' - информация, предупреждения и ошибки
* - 'debug' - полная отладочная информация
*/
logLevel?: 'silent' | 'error' | 'warn' | 'info' | 'debug';
}
/**
* 🔌 WebSocket клиент для project sync уведомлений
*/
export declare class ProjectSyncClient {
private socket;
private readonly baseURL;
private readonly options;
private connected;
private retryCount;
private reconnectTimer;
private subscribedProjects;
private idleWarningTimer;
private readonly IDLE_WARNING_DELAY;
private errorDebounce;
private readonly ERROR_DEBOUNCE_MS;
private lastConnectionError;
private eventHandlers;
/**
* Logger для отладки с поддержкой logLevel и debounce
*/
private logger;
constructor(options: ProjectSyncClientOptions);
/**
* 📝 Проверка уровня логирования
*/
private shouldLog;
/**
* 🔄 Логирование ошибок с debounce для снижения спама
*/
private logErrorWithDebounce;
/**
* 🔌 Подключение к WebSocket
*/
connect(): Promise<void>;
/**
* ❌ Отключение от WebSocket
*/
disconnect(): void;
/**
* 📡 Подписка на проект для получения уведомлений
*/
subscribeToProject(projectId: string, userId?: string): void;
/**
* 📡 Отписка от проекта
*/
unsubscribeFromProject(projectId: string): void;
/**
* 👂 Подписка на события
*/
on<T>(event: EventType, handler: SyncEventHandler<T>): void;
/**
* 👂 Отписка от событий
*/
off<T>(event: EventType, handler: SyncEventHandler<T>): void;
/**
* 📢 Эмиссия событий
*/
private emit;
/**
* 🔧 Настройка обработчиков событий от backend
*/
private setupEventHandlers;
/**
* ⚠️ Планирование idle предупреждения
*/
private scheduleIdleWarning;
/**
* 🔄 Планирование переподключения
*/
private scheduleReconnect;
/**
* 🔍 Проверка статуса подключения
*/
get isConnected(): boolean;
/**
* 📋 Список подписанных проектов
*/
get subscribedProjectIds(): string[];
}
//# sourceMappingURL=project-sync-client.d.ts.map