diff --git a/src/main/download/download-manager.ts b/src/main/download/download-manager.ts index 8610b31..61883f6 100644 --- a/src/main/download/download-manager.ts +++ b/src/main/download/download-manager.ts @@ -523,23 +523,37 @@ export class DownloadManager extends EventEmitter { pkg.cancelled = true; pkg.status = "cancelled"; pkg.updatedAt = nowMs(); - for (const itemId of pkg.itemIds) { + const outputDir = pkg.outputDir; + const itemIds = [...pkg.itemIds]; + + for (const itemId of itemIds) { const item = this.session.items[itemId]; if (!item) continue; const slot = this.activeTasks.get(itemId); if (slot) { slot.abortReason = "cancel"; slot.abortController.abort("cancel"); } - if (!isFinishedStatus(item.status)) { - item.status = "cancelled"; - item.fullStatus = "Abgebrochen"; - item.speedBps = 0; - item.updatedAt = nowMs(); + if (item.status !== "completed") { + this.runOutcomes.set(itemId, "cancelled"); } this.releaseTargetPath(itemId); this.retryManager.removeItem(itemId); + this.cachedDirectUrls.delete(itemId); + this.itemContributedBytes.delete(itemId); + delete this.session.items[itemId]; + this.itemCount = Math.max(0, this.itemCount - 1); } + this.postProcessor.abortPackage(packageId); + this.historyRecordedPackages.delete(packageId); + this.hybridExtractRequeue.delete(packageId); + this.packagePostProcessTasks.delete(packageId); + delete this.session.packages[packageId]; + this.session.packageOrder = this.session.packageOrder.filter(id => id !== packageId); + this.persistSoon(); this.emitState(); + + // Cleanup artifacts in background + void cleanupCancelledPackageArtifactsAsync(outputDir).catch(() => {}); } public resetPackage(packageId: string): void {