diff --git a/tasks/download.ts b/tasks/download.ts index dc3b93f..2c7af0b 100644 --- a/tasks/download.ts +++ b/tasks/download.ts @@ -343,6 +343,9 @@ export async function download_task( signal: force_abort, preventClose: true, }); + if (pr.error) { + throw (pr.error); + } } finally { try { f.close(); diff --git a/utils/progress_readable.ts b/utils/progress_readable.ts index 498d0dd..a44d843 100644 --- a/utils/progress_readable.ts +++ b/utils/progress_readable.ts @@ -6,29 +6,38 @@ type EventMap = { export class ProgressReadable extends EventTarget { readable: ReadableStream; readed: number; + error?: unknown; constructor(readable: ReadableStream) { super(); this.readed = 0; const reader = readable.getReader(); this.readable = new ReadableStream({ - pull: async (c) => { + pull: (c) => { if (c.byobRequest) { throw Error("Unimplemented."); } else { - const v = await reader.read(); - if (v.done) { - this.dispatchEvent("finished", this.readed); + reader.read().then((v) => { + if (v.done) { + this.dispatchEvent("finished", this.readed); + c.close(); + return; + } else { + this.readed += v.value.byteLength; + this.dispatchEvent("progress", this.readed); + c.enqueue(v.value); + } + }).catch((e) => { c.close(); - return; - } else { - this.readed += v.value.byteLength; - this.dispatchEvent("progress", this.readed); - c.enqueue(v.value); - } + this.error = e; + }); } }, cancel: (reason) => { - readable.cancel(reason); + try { + readable.cancel(reason); + } catch (_) { + null; + } }, type: "bytes", });