llm-agent-plugin/src/utils/WebSocketService.ts
2025-10-11 23:48:49 +03:00

85 lines
2.7 KiB
TypeScript

import { io, Socket } from 'socket.io-client';
import { EventBus } from './EventBus';
export class WebSocketService {
private socket: Socket | null = null;
private eventBus: EventBus;
private apiBaseUrl: string;
constructor(eventBus: EventBus, apiBaseUrl: string) {
this.eventBus = eventBus;
this.apiBaseUrl = apiBaseUrl;
}
/**
* Подключается к WebSocket серверу
*/
connect(): void {
if (this.socket?.connected) {
console.log('WebSocket уже подключен');
return;
}
// Извлекаем базовый URL без /api
const wsUrl = this.apiBaseUrl.replace('/api', '');
this.socket = io(wsUrl, {
transports: ['websocket', 'polling'],
reconnection: true,
reconnectionDelay: 1000,
reconnectionDelayMax: 5000,
reconnectionAttempts: 5
});
this.setupEventHandlers();
}
/**
* Настраивает обработчики WebSocket событий
*/
private setupEventHandlers(): void {
if (!this.socket) return;
this.socket.on('connect', () => {
console.log('✅ WebSocket подключен');
});
this.socket.on('disconnect', (reason) => {
console.log('❌ WebSocket отключен:', reason);
});
this.socket.on('connect_error', (error) => {
console.error('Ошибка подключения WebSocket:', error);
});
// ----------------------------------------------- Title Update Events ---------------------------------------------------------------
this.socket.on('graph_title_updated', (data: { graph_id: string; title: string }) => {
console.log('📊 Получено обновление заголовка графа:', data);
this.eventBus.emit('ws-graph-title-updated', data);
});
this.socket.on('node_title_updated', (data: { graph_id: string; node_id: string; title: string }) => {
console.log('📝 Получено обновление заголовка узла:', data);
this.eventBus.emit('ws-node-title-updated', data);
});
}
/**
* Отключается от WebSocket сервера
*/
disconnect(): void {
if (this.socket) {
this.socket.disconnect();
this.socket = null;
console.log('WebSocket отключен');
}
}
/**
* Проверяет статус подключения
*/
isConnected(): boolean {
return this.socket?.connected ?? false;
}
}