fix(download): 下载失败时补全日志,避免卡在"正在获取 Metalink"突兀退出

- 主进程 Metalink 下载请求失败显式 sendLog 并回传渲染端(原仅静默 logger.error)
- aria2c 拉起失败补 sendLog 日志
- Metalink 写入完成补 sendLog 提示
- 渲染端 install-complete 失败分支将错误原因写入 logs,并补成功/失败终止日志
- 配套: 缓存修复(C1 主进程 no-cache + C2 axios ?_t 版本戳) 已在上一提交实现
- 文档 docs/app-list-cache-analysis.md 新增第8节下载日志断层修复方案
This commit is contained in:
xiyidaiwa
2026-08-11 18:50:31 +08:00
parent e0e6c50b89
commit 7cafcc51f6
3 changed files with 266 additions and 7 deletions
+18 -7
View File
@@ -547,21 +547,31 @@ async function runDownloadPhase(task: InstallTask) {
sendLog(`正在获取 Metalink 文件: ${task.metalinkUrl}`);
const response = await axios.get(task.metalinkUrl, {
baseURL: "https://erotica.spark-app.store",
responseType: "stream",
});
let response: Awaited<ReturnType<typeof axios.get>>;
try {
response = await axios.get(task.metalinkUrl, {
baseURL: "https://erotica.spark-app.store",
responseType: "stream",
});
} catch (err) {
// Metalink 请求失败(网络/404/超时等):明确回传渲染端,避免 UI 停在"正在获取"后突兀退出
const reason = err instanceof Error ? err.message : String(err);
logger.error(`Task ${id} Metalink 下载请求失败: ${reason}`);
sendLog(`获取 Metalink 失败: ${reason}`);
throw new Error(`获取 Metalink 失败: ${reason}`);
}
const writer = fs.createWriteStream(metalinkPath);
response.data.pipe(writer);
await new Promise<void>((resolve, reject) => {
writer.on("finish", resolve);
writer.on("finish", () => {
sendLog("Metalink 文件下载完成");
resolve();
});
writer.on("error", reject);
});
sendLog("Metalink 文件下载完成");
// 清理下载目录中的旧文件(保留 .metalink 文件),防止 aria2c 因同名文件卡住
const existingFiles = fs.readdirSync(downloadDir);
for (const file of existingFiles) {
@@ -675,6 +685,7 @@ async function runDownloadPhase(task: InstallTask) {
});
child.on("error", (err) => {
clearInterval(timeoutChecker);
sendLog(`aria2c 启动失败: ${err.message}`);
reject(err);
});
});