From a44a50878c9147360534df034823bba8c4378fec Mon Sep 17 00:00:00 2001 From: Leo Vasanko Date: Tue, 30 Sep 2025 18:49:50 -0600 Subject: [PATCH] Improved reliability of direct to folder downloads. --- frontend/src/components/DownloadButton.vue | 63 ++++++++++++---------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/frontend/src/components/DownloadButton.vue b/frontend/src/components/DownloadButton.vue index a88f955..7d25661 100644 --- a/frontend/src/components/DownloadButton.vue +++ b/frontend/src/components/DownloadButton.vue @@ -78,7 +78,7 @@ const filesystemdl = async (sel: SelectedItems, handle: FileSystemDirectoryHandl h = await h.getDirectoryHandle(dir.normalize('NFC'), { create: true }) } catch (error) { console.error('Failed to create directory', hdir, error) - return + throw new Error(`Failed to create directory ${hdir}: ${error}`) } console.log('Created', hdir) } @@ -90,37 +90,42 @@ const filesystemdl = async (sel: SelectedItems, handle: FileSystemDirectoryHandl fileHandle = await h.getFileHandle(name, { create: true }) } catch (error) { console.error('Failed to create file', rel, full, hdir + name, error) - return + throw new Error(`Failed to create file ${hdir + name}: ${error}`) } - const writable = await fileHandle.createWritable() - const url = `/files/${rel}` - console.log('Fetching', url) - const res = await fetch(url) - if (!res.ok) { - store.error = `Failed to download ${url}: ${res.status} ${res.statusText}` - throw new Error(`Failed to download ${url}: ${res.status} ${res.statusText}`) - } - if (res.body) { - ++store.dprogress.fileidx - const reader = res.body.getReader() - await writable.truncate(0) - store.error = "Direct download." - store.dprogress.tlast = Date.now() - while (true) { - const { value, done } = await reader.read() - if (done) break - await writable.write(value) - const now = Date.now() - const size = value.byteLength - store.dprogress.xfer += size - store.dprogress.filepos += size - store.dprogress.statbytes += size - store.dprogress.statdur += now - store.dprogress.tlast - store.dprogress.tlast = now + try { + const writable = await fileHandle.createWritable() + const url = `/files/${rel}` + console.log('Fetching', url) + const res = await fetch(url) + if (!res.ok) { + store.error = `Failed to download ${url}: ${res.status} ${res.statusText}` + throw new Error(`Failed to download ${url}: ${res.status} ${res.statusText}`) } + if (res.body) { + ++store.dprogress.fileidx + const reader = res.body.getReader() + await writable.truncate(0) + store.error = "Direct download." + store.dprogress.tlast = Date.now() + while (true) { + const { value, done } = await reader.read() + if (done) break + await writable.write(value) + const now = Date.now() + const size = value.byteLength + store.dprogress.xfer += size + store.dprogress.filepos += size + store.dprogress.statbytes += size + store.dprogress.statdur += now - store.dprogress.tlast + store.dprogress.tlast = now + } + } + await writable.close() + console.log('Saved', hdir + name) + } catch (error) { + console.error('Failed to write file', hdir + name, error) + throw new Error(`Failed to write file ${hdir + name}: ${error}`) } - await writable.close() - console.log('Saved', hdir + name) } statReset() }