diff --git a/electron/main/backend/install-manager.ts b/electron/main/backend/install-manager.ts index e0fcc8a3..5e7fe784 100644 --- a/electron/main/backend/install-manager.ts +++ b/electron/main/backend/install-manager.ts @@ -561,20 +561,42 @@ async function processNextInQueue() { let stdout = ""; let stderr = ""; + let logBuffer = ""; + let logBufferTimer: NodeJS.Timeout | null = null; + const LOG_FLUSH_MS = 100; + + const flushLogBuffer = () => { + if (logBuffer.length > 0) { + sendLog(logBuffer); + logBuffer = ""; + } + logBufferTimer = null; + }; + + const bufferedSendLog = (message: string) => { + logBuffer += message; + if (!logBufferTimer) { + logBufferTimer = setTimeout(flushLogBuffer, LOG_FLUSH_MS); + } + }; child.stdout.on("data", (d) => { const s = d.toString(); stdout += s; - sendLog(s); + bufferedSendLog(s); }); child.stderr.on("data", (d) => { const s = d.toString(); stderr += s; - sendLog(s); + bufferedSendLog(s); }); child.on("close", (code) => { + if (logBufferTimer) { + clearTimeout(logBufferTimer); + flushLogBuffer(); + } if (task.cancelled) { reject(new Error("安装已取消")); return; diff --git a/src/modules/processInstall.ts b/src/modules/processInstall.ts index fad143b0..7d60b1a6 100644 --- a/src/modules/processInstall.ts +++ b/src/modules/processInstall.ts @@ -183,13 +183,19 @@ window.ipcRenderer.on( }, ); +const MAX_LOG_ENTRIES = 500; + window.ipcRenderer.on("install-log", (_event, log: InstallLog) => { const downloadObj = downloads.value.find((d) => d.id === log.id); - if (downloadObj) + if (downloadObj) { downloadObj.logs.push({ time: log.time, message: log.message, }); + if (downloadObj.logs.length > MAX_LOG_ENTRIES) { + downloadObj.logs.splice(0, downloadObj.logs.length - MAX_LOG_ENTRIES); + } + } }); window.ipcRenderer.on("install-complete", (_event, log: DownloadResult) => {