fix(downloads): restore hardened output scope release gates

Detect stale or foreign files in package-specific extraction directories before starting fresh work while excluding current and atomic ownership markers.

Keep recursive directory inspection confined to the start-conflict boundary and let archive cleanup prune empty package directories directly.

Register German-audio, auto-rename, collection, hybrid, and legacy fixtures through real complete PackageOutputScope records with current method signatures.

Verify plain stops only persist after active work drains, while update-restart parking keeps both its immediate checkpoint and final queued state.
This commit is contained in:
Sucukdeluxe
2026-08-22 18:24:50 +02:00
parent ea904aff79
commit 0d73f7e074
6 changed files with 155 additions and 78 deletions
+5 -3
View File
@@ -131,15 +131,15 @@ async function driveActiveDownload(root: string): Promise<{ manager: DownloadMan
}
describe("update restart resume", () => {
it("characterization: a plain stop() leaves an in-flight item cancelled across a restart", async () => {
it("persists a drained plain stop as cancelled across a restart", async () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-update-resume-"));
tempDirs.push(root);
const { manager, paths, serverStop } = await driveActiveDownload(root);
try {
manager.stop();
manager.persistNowSync();
await waitFor(() => (manager as unknown as { activeTasks: Map<string, unknown> }).activeTasks.size === 0);
manager.prepareForShutdown();
manager.persistForShutdown();
const reloaded = loadSession(paths);
const item = Object.values(reloaded.items)[0];
@@ -150,15 +150,17 @@ describe("update restart resume", () => {
}
});
it("parks an in-flight item as queued for an update restart so it auto-resumes", async () => {
it("checkpoints and finally persists an update-parked item as queued so it auto-resumes", async () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "rd-update-resume-"));
tempDirs.push(root);
const { manager, paths, serverStop } = await driveActiveDownload(root);
try {
manager.stop({ parkForRestart: true });
manager.persistNowSync();
expect(Object.values(loadSession(paths).items)[0]?.status).toBe("queued");
await waitFor(() => (manager as unknown as { activeTasks: Map<string, unknown> }).activeTasks.size === 0);
manager.prepareForShutdown();
manager.persistForShutdown();
const reloaded = loadSession(paths);
const item = Object.values(reloaded.items)[0];