diff --git a/frontend/src/lib/offline/DownloadManager.ts b/frontend/src/lib/offline/DownloadManager.ts index 2b5d697..02da5a8 100644 --- a/frontend/src/lib/offline/DownloadManager.ts +++ b/frontend/src/lib/offline/DownloadManager.ts @@ -242,7 +242,8 @@ class DownloadManagerClass { const job = this.queue.shift(); if (!job) break; - this.activeDownloads.set(job.url, job); + // Use storageKey as Map key (stable) instead of url (can change on fallback) + this.activeDownloads.set(job.storageKey, job); this.downloadAsset(job); } @@ -466,7 +467,7 @@ class DownloadManagerClass { job.reject?.(error instanceof Error ? error : new Error(errorMessage)); } } finally { - this.activeDownloads.delete(job.url); + this.activeDownloads.delete(job.storageKey); downloadEventBus.emitQueueUpdate(); this.processQueue(); } @@ -507,12 +508,12 @@ class DownloadManagerClass { * Cancel a specific download */ cancelJob(jobId: string): void { - // Check active downloads + // Check active downloads (keyed by storageKey) const entries = Array.from(this.activeDownloads.entries()); - for (const [url, job] of entries) { + for (const [storageKey, job] of entries) { if (job.id === jobId) { job.abortController?.abort(); - this.activeDownloads.delete(url); + this.activeDownloads.delete(storageKey); OfflineDbManager.removeFromQueue(jobId); downloadEventBus.emitQueueUpdate(); return; @@ -532,12 +533,12 @@ class DownloadManagerClass { * Cancel all downloads for a project */ cancelProjectDownloads(projectId: string): void { - // Cancel active downloads + // Cancel active downloads (keyed by storageKey) const entries = Array.from(this.activeDownloads.entries()); - for (const [url, job] of entries) { + for (const [storageKey, job] of entries) { if (job.projectId === projectId) { job.abortController?.abort(); - this.activeDownloads.delete(url); + this.activeDownloads.delete(storageKey); } }