Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 19 additions & 8 deletions src/utils/Downloader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ export default class Downloader extends EventEmitter {
let completed = 0; // Number of downloads completed
let downloaded = 0; // Cumulative bytes downloaded
let queued = 0; // Index of the next file to download
const maxRetries = 5; // Maximum number of retries for failed downloads

let start = Date.now();
let before = 0;
Expand All @@ -119,7 +120,7 @@ export default class Downloader extends EventEmitter {
}, 500);

// Recursive function that downloads the next file in the queue
const downloadNext = async (): Promise<void> => {
const downloadNext = async (retries = 0): Promise<void> => {
if (queued < files.length) {
const file = files[queued];
queued++;
Expand Down Expand Up @@ -147,17 +148,27 @@ export default class Downloader extends EventEmitter {
downloadNext();
});

response.body.on('error', (err: Error) => {
response.body.on('error', async (err: Error) => {
writer.end();
completed++;
downloadNext();
this.emit('error', err);
if (retries < maxRetries) {
this.emit('retry', file, retries + 1);
await downloadNext(retries + 1);
} else {
completed++;
downloadNext();
this.emit('error', err);
}
});
} catch (e) {
writer.end();
completed++;
downloadNext();
this.emit('error', e);
if (retries < maxRetries) {
this.emit('retry', file, retries + 1);
await downloadNext(retries + 1);
} else {
completed++;
downloadNext();
this.emit('error', e);
}
}
}
};
Expand Down