mirror of
https://github.com/screentinker/screentinker.git
synced 2026-08-13 22:03:13 -06:00
A site on a marginal link (the report came from a one-bar 5G install) could never fill its cache. Every attempt started at byte 0 and the .part was deleted on any interruption, so an asset larger than one call's worth of transfer was discarded and re-fetched forever — five minutes of progress thrown away, back off, five more minutes, thrown away. With nothing cached, the player showed the waiting state, which is what got reported as "the screens go black instead of playing cached content". The offline playback path was never the problem; the cache simply could not be filled. An interrupted download now keeps its .part and the next attempt asks for the rest with Range. Two ways that could corrupt the cache, both closed: If-Range with a stored validator makes a changed asset come back as a full 200 (restart) rather than a spliceable tail, and a partial longer than the asset gets a 416 and is discarded. Bytes are kept only when they can be built upon — with no validator there is no safe resume, so the partial is dropped and the attempt backs off as the failure it is, rather than re-fetching the same prefix forever. DownloadCoordinator now distinguishes progress from failure: attempts chain while bytes are landing (bounded, single-flight held throughout) and only a no-progress attempt escalates the exponential backoff or acks "failed" — an advancing download is not a failed one and should not be shown as such. Server side is unchanged; res.sendFile already serves Range/If-Range, and content-range-resume.test.js pins that since it is load-bearing and a future middleware could silently remove it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Uaeo9MvzKoyXuN6ZsbhtkL |
||
|---|---|---|
| .. | ||
| config | ||
| db | ||
| lib | ||
| middleware | ||
| player | ||
| routes | ||
| scripts | ||
| services | ||
| test | ||
| ws | ||
| .gitignore | ||
| config.js | ||
| package-lock.json | ||
| package.json | ||
| server.js | ||
| smoke-ui.js | ||
| version.js | ||