Files
DLE/frontend/src/composables/useWebSshLogs.js
2025-10-30 22:41:04 +03:00

225 lines
6.8 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
import { ref, onMounted, onUnmounted } from 'vue';
/**
* Композабл для real-time логов WebSSH агента
*/
export function useWebSshLogs() {
const logs = ref([]);
const isConnected = ref(false);
const isListening = ref(false);
const maxLogs = 1000; // Максимальное количество логов в памяти
let ws = null;
// Добавление нового лога
const addLog = (type, message, timestamp = new Date()) => {
const logEntry = {
id: Date.now() + Math.random(),
type, // 'info', 'success', 'error', 'warning', 'debug'
message,
timestamp
};
logs.value.push(logEntry);
// Ограничиваем количество логов в памяти
if (logs.value.length > maxLogs) {
logs.value = logs.value.slice(-maxLogs);
}
// Автоматическая прокрутка к последнему логу
setTimeout(() => {
const logContainer = document.querySelector('.log-container');
if (logContainer) {
logContainer.scrollTop = logContainer.scrollHeight;
}
}, 100);
};
// Обработчик WebSocket сообщений
const handleWebSshLog = (data) => {
console.log('[WebSSH Logs] Получен лог:', data);
if (data.type === 'webssh_log') {
addLog(data.logType || 'info', data.message, new Date(data.timestamp || Date.now()));
}
};
// Обработчик WebSocket сообщений о статусе агента
const handleWebSshStatus = (data) => {
console.log('[WebSSH Logs] Получен статус:', data);
if (data.type === 'webssh_status') {
isConnected.value = data.connected;
if (data.message) {
addLog(data.status === 'connected' ? 'success' : 'error', data.message);
}
}
};
// Обработчик WebSocket сообщений о прогрессе
const handleWebSshProgress = (data) => {
console.log('[WebSSH Logs] Получен прогресс:', data);
if (data.type === 'webssh_progress') {
const progressMessage = `[${data.stage}] ${data.message}`;
addLog('info', progressMessage);
if (data.percentage) {
addLog('debug', `Прогресс: ${data.percentage}%`);
}
}
};
// Начать прослушивание логов
const startListening = () => {
if (isListening.value) return;
console.log('[WebSSH Logs] Начинаем прослушивание логов...');
try {
// Подключаемся к WebSSH Agent WebSocket
// Всегда используем localhost:3000, так как порт проброшен в Docker
const wsUrl = 'ws://localhost:3000';
console.log('[WebSSH Logs] Подключение к:', wsUrl);
ws = new WebSocket(wsUrl);
ws.onopen = () => {
console.log('[WebSSH Logs] Подключено к WebSSH Agent');
isConnected.value = true;
addLog('success', 'Подключено к WebSSH Agent');
};
ws.onclose = () => {
console.log('[WebSSH Logs] Отключено от WebSSH Agent');
isConnected.value = false;
addLog('warning', 'Отключено от WebSSH Agent');
};
ws.onmessage = (event) => {
try {
const data = JSON.parse(event.data);
// Обрабатываем разные типы сообщений
switch (data.type) {
case 'webssh_log':
handleWebSshLog(data);
break;
case 'webssh_status':
handleWebSshStatus(data);
break;
case 'webssh_progress':
handleWebSshProgress(data);
break;
default:
console.log('[WebSSH Logs] Неизвестный тип сообщения:', data.type);
}
} catch (error) {
console.error('[WebSSH Logs] Ошибка парсинга сообщения:', error);
}
};
ws.onerror = (error) => {
console.error('[WebSSH Logs] Ошибка WebSocket:', error);
addLog('error', 'Ошибка подключения к WebSSH Agent');
};
isListening.value = true;
addLog('info', 'Подключение к WebSSH логам...');
} catch (error) {
console.error('[WebSSH Logs] Ошибка создания WebSocket:', error);
addLog('error', 'Не удалось подключиться к WebSSH Agent');
}
};
// Остановить прослушивание логов
const stopListening = () => {
if (!isListening.value) return;
console.log('[WebSSH Logs] Останавливаем прослушивание логов...');
// Отключаемся от WebSSH Agent
if (ws) {
ws.close();
ws = null;
}
isListening.value = false;
isConnected.value = false;
addLog('info', 'Отключение от WebSSH логов');
};
// Очистить логи
const clearLogs = () => {
logs.value = [];
addLog('info', 'Логи очищены');
};
// Форматирование времени
const formatTime = (timestamp) => {
return timestamp.toLocaleTimeString('ru-RU', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
};
// Получить цвет для типа лога
const getLogColor = (type) => {
switch (type) {
case 'success': return '#27ae60';
case 'error': return '#e74c3c';
case 'warning': return '#f39c12';
case 'debug': return '#95a5a6';
default: return '#3498db';
}
};
// Получить иконку для типа лога
const getLogIcon = (type) => {
switch (type) {
case 'success': return '✅';
case 'error': return '❌';
case 'warning': return '⚠️';
case 'debug': return '🔍';
default: return '';
}
};
// Автоматическое подключение при монтировании компонента
onMounted(() => {
startListening();
});
// Автоматическое отключение при размонтировании компонента
onUnmounted(() => {
stopListening();
});
return {
logs,
isConnected,
isListening,
addLog,
startListening,
stopListening,
clearLogs,
formatTime,
getLogColor,
getLogIcon
};
}