Skip to content

Commit b06823f

Browse files
committed
feat: improve download engine performance and error handling with async stream closure
1 parent 48f4205 commit b06823f

3 files changed

Lines changed: 17 additions & 5 deletions

File tree

src/download/download-engine/download-file/download-engine-file.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,8 @@ export default class DownloadEngineFile extends EventEmitter<DownloadEngineFileE
234234
await this.options.onStartedAsync?.();
235235
this._sendProgressDownloadPart();
236236

237+
const streamPromises = new Set<Promise<void>>();
238+
237239
for (let i = this._progress.part; i < this.file.parts.length && !this.options.skipExisting; i++) {
238240
if (this._closed) return;
239241
// If we are starting a new part, we need to reset the progress
@@ -275,7 +277,17 @@ export default class DownloadEngineFile extends EventEmitter<DownloadEngineFileE
275277
await this._downloadSlice(0, chunksToRead);
276278
}
277279

278-
this._activePart.fetchStream.close();
280+
const closePromise = this._activePart.fetchStream.close();
281+
if (closePromise) {
282+
streamPromises.add(closePromise);
283+
closePromise.then(() => {
284+
streamPromises.delete(closePromise);
285+
});
286+
}
287+
}
288+
289+
if (streamPromises.size > 0) {
290+
await Promise.all(streamPromises);
279291
}
280292

281293
// All parts are downloaded, we can clear the progress

src/download/download-engine/engine/base-download-engine.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ export default class BaseDownloadEngine extends EventEmitter<BaseDownloadEngineE
224224
return downloadFile;
225225
}
226226

227-
protected static _validatePartRange(url: string, range: InputRange, remoteFileSize?: number) {
227+
protected static _validatePartRange(url: string, range: InputRange, remoteFileSize: number = 0) {
228228
if (range.start < 0) {
229229
throw new InvalidOptionError(`Range start cannot be negative for URL: ${url}`);
230230
}
@@ -233,7 +233,7 @@ export default class BaseDownloadEngine extends EventEmitter<BaseDownloadEngineE
233233
throw new InvalidOptionError(`Range start (${range.start}) cannot be greater than range end (${range.end}) for URL: ${url}`);
234234
}
235235

236-
if (remoteFileSize != null && range.end >= remoteFileSize) {
236+
if (remoteFileSize > 0 && range.end >= remoteFileSize) {
237237
throw new RangeOutOfPartLengthError(url, range.end, remoteFileSize);
238238
}
239239
}

src/download/download-engine/streams/download-engine-fetch-stream/download-engine-fetch-stream-local-file.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ export default class DownloadEngineFetchStreamLocalFile extends BaseDownloadEngi
5656
};
5757
}
5858

59-
override close() {
59+
override async close() {
6060
super.close();
61-
this._fd?.close();
61+
await this._fd?.close();
6262
this._fd = null;
6363
}
6464
}

0 commit comments

Comments
 (0)