Resumable saves: ranged downloads that survive dropped connections, reloads and app kills
Server
- /api/download/:id answers Range with a strong ETag ("<id>.<gen>") and honours
If-Range; a stale partial gets the whole current file (streamed, so Bun does
not re-apply the Range itself). Uploads get the same treatment.
- GET /api/download/:id/prepare never blocks: ready {gen,size,sha256,etag,ext},
working (server still fetching), legacy (HEVC / too long / cache offline),
failed. Recently refused prepares are remembered for 10 minutes.
Browser
- The OPFS worker saves in 8 MiB ranges, writes at the byte offset, flushes
each chunk, retries each chunk 6 times with backoff (30 s idle timeout) and
keeps the .part plus a .part.json sidecar naming the server copy it belongs
to. A changed copy restarts cleanly; the finished file is hashed once and
checked against the server's SHA-256.
- SaveQueue remembers unfinished saves and resumes them on start, online,
return to the foreground and every 2 minutes while visible; one at a time.
- Downloads shows live MB progress, 'Preparing on server', 'Verifying', and
paused saves with Resume and Cancel (confirmed).
- listVideos ignores the sidecars; new listPartials/discardPartial helpers.
Verified in Chromium through a connection-dropping proxy: paused at 8 MiB,
auto-resumed after a reload from byte 8388608, final SHA-256 matched.
This commit is contained in:
@@ -4268,3 +4268,15 @@ body.landscape-fs .player-stage { touch-action: none; } /* fullscreen (real or t
|
||||
|
||||
/* P2P: "Get it from a device" next to Retry (plan 017) */
|
||||
.peer-btn { margin-left: 8px; }
|
||||
|
||||
/* Resumable saves: a real progress bar once the size is known, paused rows */
|
||||
.dl-bar.determinate { animation: none; transform: none; border-radius: 0 2px 2px 0; transition: width 0.4s ease; }
|
||||
.card.dl-paused .dl-bar { background: var(--text-dim); }
|
||||
.dl-actions { display: flex; gap: 8px; margin-top: 8px; }
|
||||
.dl-act {
|
||||
height: 32px; padding: 0 12px; border-radius: 10px; cursor: pointer;
|
||||
border: 1px solid var(--line); background: var(--bg-2); color: var(--text);
|
||||
font: 600 12px var(--ui);
|
||||
}
|
||||
.dl-act:hover { border-color: var(--accent); }
|
||||
.dl-act.danger:hover { border-color: #ff5a4f; color: #ff5a4f; }
|
||||
|
||||
Reference in New Issue
Block a user