feat: download ETA on the press bar from measured Soulseek throughput
Show a live "~Xm left" countdown on the download progress bar. The slskd download loop already polls byte transfer every 3s; measure the actual throughput (EWMA- smoothed bytes/sec), compute seconds-remaining from the album's total bytes, and surface it. New nullable Job.downloadEtaSeconds (migration; web entrypoint runs prisma migrate deploy), threaded through the on_progress callback (optional 2nd arg, so other adapters/callers are unaffected — they report no ETA). API exposes it; queue.tsx renders etaLabel() after the track count. Null when unknown (no sample yet or a source that doesn't report bytes). Worker 330 tests, web 214 tests, both green; verified live-rendered as "42% · 6/14 tracks · ~4m left". Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,20 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import { describeJob, timeAgo } from "./status";
|
||||
import { describeJob, etaLabel, timeAgo } from "./status";
|
||||
|
||||
describe("etaLabel", () => {
|
||||
it("formats seconds, minutes, and hours", () => {
|
||||
expect(etaLabel(45)).toBe("~45s left");
|
||||
expect(etaLabel(240)).toBe("~4m left");
|
||||
expect(etaLabel(3900)).toBe("~1h 5m left");
|
||||
});
|
||||
|
||||
it("returns null for missing or non-positive input", () => {
|
||||
expect(etaLabel(null)).toBeNull();
|
||||
expect(etaLabel(undefined)).toBeNull();
|
||||
expect(etaLabel(0)).toBeNull();
|
||||
expect(etaLabel(-5)).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("describeJob", () => {
|
||||
it("maps pipeline states to literal labels + severity kind", () => {
|
||||
|
||||
Reference in New Issue
Block a user