Repository navigation
fix(downloads): 让卡住/已取消的下载能重下,已完成的行不再常驻 - #90
Open
std-external wants to merge 1 commit into
Open
std-external wants to merge 1 commit into
std-external wants to merge 1 commit into
Conversation
下载页/Mod 列表在几种情况下会永久卡住,只能重进页面: - downloadMod() 在「同名任务还是 pending」时直接返回,不触发任何回调, 于是 await 它的调用方(Mod 列表按钮、管理页「安装缺失依赖」)的 promise 永远不 settle,按钮停在「下载中…」且被 disabled。 - 取消后任务仍是 pending(另带 canceled 标记),Mod 列表点下载直接 return, 下载页只有 failed 才有重试按钮 → 取消过就再也重下不了。 - Downloads 页渲染所有 requested 任务且没有任何地方清理任务,已完成的行会 一直停在 100%,而侧边栏徽章只数 pending,两处长期不一致。 改动: - 新增 downloadTasks.ts:attempt 决策(start/attach)与已完成行的可见性规则。 - downloadMod():仍在下行时把新调用方的回调接到该次尝试上;已取消/已失败 则正常开新尝试。 - ModList / DownloadList 的下载按钮:canceled 也可重试。 - DownloadListPage:已完成的行保留 4 秒后自动消失,计数随之一致。 - ureq.rs 增加回归测试,锁住 PR std-microblock#84 的读/写/连接超时(没有它就再也无法从 「连上但不发数据」的卡死里恢复)。
This was referenced Oct 15, 2026
Contributor
Author
补一组 1.2.2 的实机证据(同一现象,用户新反馈)用户在 CeleMod 1.2.2 上复现(本 PR 尚未合并,所以现象依旧),下载页里 4 行标着「已完成」的 Mod 一直挂在列表里: (截图仅裁出 CeleMod 窗口,去掉桌面/其它窗口。) 1) 「已完成的行不消失」是 bug,不是「保留历史」的设计
2) 「100% 125 KB/125 KB 但 0 B/s」不是另一条卡死路径它是已完成任务的正常外观,不是「速度上报停了但完成事件没发」:
录屏里唯一"像卡住"的是依赖行 3) 顺带确认的一条「下载中很慢」的成因(不在本 PR 内)录屏里同时有十几个任务在跑,每个只有 5–30 KiB/s( 本 PR 现在的效果(对照)
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

问题
群里(Celeste Coders)有用户报告:下载的 Mod 会卡住进度,必须重进 Mod 页面才能重新下载;另外下载好的 Mod 在「下载任务」页里进度条停在 100% 不消失,而左下角侧边栏的徽章数字是另一回事。用户是在网吧玩的,每次都是全新安装、所有 Mod 都是首次下载。
原因(都指到文件行)
src/celemod-ui/src/stores/download.ts:395(原:335):downloadMod()发现同名任务已经是pending就直接return existingTask,既不发起新请求,也不触发传入的onFinished/onFailed。于是await它的调用方永远等不到结果:src/components/ModList.tsx的下载按钮 —— 点了没反应;src/routes/Manage.tsx:1606downloadMissing()(「安装缺失依赖」按钮)—— 按钮永久停在「下载中…」且disabled。组件不重挂(= 重进页面)就一直卡着。
src/celemod-ui/src/stores/download.ts:114:取消之后任务仍是state: "pending"(另带canceled标记),ModList.tsx:217的if (downloadTask) { ... return; }只认failed,于是取消过/卡住过的 Mod 再也点不动;DownloadList.tsx的重试按钮同样只有failed才有 —— 卡住时唯一的出路是取消,取消后就没法重下,只能重进页面或换个入口(RecommendMods.tsx恰好允许 canceled 重试,所以「换个页面又能下」)。src/celemod-ui/src/components/DownloadList.tsx:311(DownloadListPage):页面渲染所有requested任务,而 store 里没有任何地方删除任务(download.ts只有tasks: {}初值)。已完成的任务因此永远停在 100%;同时visibleCount只数非 finished,出现「100% 的任务行 + 计数 0 项」的自相矛盾,直到重启 App。src-tauri/src/ureq.rs:39(download_agent,PR fix(download): 下载链路走 ureq 自带的环境代理 + 补上读写超时 #84 加的timeout_connect/read/write = 30s)是「连上但不发数据」唯一的兜底,没有测试锁住。修复
src/celemod-ui/src/downloadTasks.ts:把「这次该开新尝试还是挂到已有尝试上」和「已完成的行什么时候退场」抽成纯函数,便于测试。downloadMod():仍在下行时把新调用方的onFinished/onFailed接到这次尝试上(不会再吞掉请求);已取消/已失败的任务正常开新尝试。canceled也可重试(下载页的重试按钮从「只有 failed」放宽到「failed 或 canceled」)。ureq.rs:新增download_agent_bounds_every_network_wait,断言 download agent 带 30s 的 read/write/connect 超时。改动范围仅前端 + 一个测试,不动下载协议、不动镜像选择逻辑。
验证
cargo test --lib→ 114 passed(含新测试)cargo fmt --check干净pnpm typecheck(tsc --noEmit)干净,prettier 干净node --import tsx --test src/downloadTasks.test.ts→ 5 passed;仓库现有前端测试(catalog-download / crash-trace / deep-link / mod-updates)全绿pnpm test:download-tasks已加进 package.json顺带查到、但不在本 PR 里的两件事(供参考)
GET celeste.weg.fan/api/v2/download/gamebanana-files/1848970→ 302 →/api/v2/download/files/590035773449893743→HTTP 500 {"code":10000,"message":"制作镜像失败"}(57 B,0.33 s,实测;/api/v2/mirror/status/590035773449893743一直是 0/0,说明没有排队任务)。CeleMod 把它当普通网络错误重试 3+3 次后失败,报错只有status code 500。对「首次下载」的用户来说,这条路径体验就是「点了下不动/失败」。ChinaMirror.cs的PrepareFile(),只在镜像选 weg.fan 时走):HEAD下载 URL 且不跟随重定向,从Location取/api/v2/download/files/(\d+)当 fileId;POST /api/v1/mirror/start-download?type=&fileName={fileId}开始制作(本机只验到 GET 会回code:400);GET /api/v1/mirror/status?type=…&fileName={fileId}(v2 等价路径/api/v2/mirror/status/{fileId},v1 会 302 过去),字段downloadProgress/uploadProgress的current/total;total == 030 s、有进度但 10 s 不动算超时。来源
Celeste Coders 群用户报告(下载卡住 / 需重进页面才能重下;已完成的行不消失),以及群主关于「镜像要先从香蕉网回源,首下会慢」的线索。