Консоль не пустеет после перезапуска менеджера
Номера строк консоли живут в памяти менеджера и после его перезапуска начинаются заново, а открытая вкладка отбрасывает всё, чей номер не больше последнего увиденного. После обновления панели консоль оставалась пустой при живом сервере — до перезагрузки страницы. У буфера появилась метка запуска: поток отдаёт её отдельным событием, и по её смене вкладка сбрасывает счётчик, чистит экран и забирает историю нового запуска заново. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+29
-3
@@ -398,17 +398,38 @@ $("#btn-task-cancel").addEventListener("click", async () => {
|
||||
|
||||
let eventSource = null;
|
||||
let lastSeq = 0;
|
||||
// Метка запуска менеджера: номера строк живут в его памяти и после
|
||||
// перезапуска начинаются заново.
|
||||
let logEpoch = null;
|
||||
const MAX_CONSOLE_LINES = 3000;
|
||||
|
||||
function openConsoleStream() {
|
||||
closeConsoleStream();
|
||||
eventSource = new EventSource(`/api/logs/stream?since=${lastSeq}`);
|
||||
eventSource.addEventListener("meta", (event) => handleConsoleMeta(JSON.parse(event.data)));
|
||||
eventSource.onmessage = (event) => appendConsoleLine(JSON.parse(event.data));
|
||||
eventSource.onerror = () => {
|
||||
// Браузер переподключается сам; сообщать об этом каждый раз не нужно.
|
||||
};
|
||||
}
|
||||
|
||||
// handleConsoleMeta ловит перезапуск менеджера: без сброса счётчика вкладка
|
||||
// приняла бы новые строки за уже показанные и осталась бы пустой до
|
||||
// перезагрузки страницы.
|
||||
function handleConsoleMeta(meta) {
|
||||
if (logEpoch === meta.epoch) return;
|
||||
const restarted = logEpoch !== null;
|
||||
logEpoch = meta.epoch;
|
||||
lastSeq = 0;
|
||||
if (!restarted) return;
|
||||
|
||||
$("#console-output").innerHTML = "";
|
||||
pushConsoleLine("manager", t("console.managerRestarted"));
|
||||
// Переоткрываем поток: этот запрашивал историю с прежнего номера, а её у
|
||||
// нового запуска нет.
|
||||
openConsoleStream();
|
||||
}
|
||||
|
||||
function closeConsoleStream() {
|
||||
if (eventSource) eventSource.close();
|
||||
eventSource = null;
|
||||
@@ -417,14 +438,19 @@ function closeConsoleStream() {
|
||||
function appendConsoleLine(line) {
|
||||
if (line.seq <= lastSeq) return;
|
||||
lastSeq = line.seq;
|
||||
pushConsoleLine(line.stream, line.text);
|
||||
}
|
||||
|
||||
// pushConsoleLine рисует строку на экране. Отдельно от нумерации: свои
|
||||
// сообщения панель показывает без номера из буфера менеджера.
|
||||
function pushConsoleLine(stream, text) {
|
||||
const output = $("#console-output");
|
||||
const filter = $("#console-filter").value.trim().toLowerCase();
|
||||
|
||||
const el = document.createElement("div");
|
||||
el.className = `line-${line.stream}`;
|
||||
el.textContent = line.text;
|
||||
el.dataset.text = line.text.toLowerCase();
|
||||
el.className = `line-${stream}`;
|
||||
el.textContent = text;
|
||||
el.dataset.text = text.toLowerCase();
|
||||
if (filter && !el.dataset.text.includes(filter)) el.hidden = true;
|
||||
output.appendChild(el);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user