🐛 fix: addJobs tracks promises so batch-done waits for them
Previously addJobs() was fire-and-forget — added jobs ran as orphaned promises. When the original batch completed, batch-done fired and uploadManager was set to null while added jobs were still running. Now: added job promises are tracked in _additionalPromises array. startBatch drains this array after the original tasks complete, ensuring batch-done only fires when ALL jobs (original + added) finish. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
3c84679df1
commit
ff6f7f8612
@ -136,6 +136,7 @@ class UploadManager extends EventEmitter {
|
||||
const batchId = `batch-${Date.now()}`;
|
||||
const results = new Map(); // filePath -> { name, size, results: [] }
|
||||
this._batchResults = results;
|
||||
this._additionalPromises = []; // Track jobs added mid-batch via addJobs()
|
||||
|
||||
for (const task of tasks) {
|
||||
const fileName = path.basename(task.file);
|
||||
@ -150,6 +151,11 @@ class UploadManager extends EventEmitter {
|
||||
|
||||
const promises = tasks.map((task) => this._runJob(task, results, signal));
|
||||
await Promise.allSettled(promises);
|
||||
// Wait for any jobs added mid-batch via addJobs()
|
||||
while (this._additionalPromises.length > 0) {
|
||||
const batch = this._additionalPromises.splice(0);
|
||||
await Promise.allSettled(batch);
|
||||
}
|
||||
|
||||
this._stopStatsTimer();
|
||||
this.running = false;
|
||||
@ -703,9 +709,9 @@ class UploadManager extends EventEmitter {
|
||||
results.set(task.file, { name: fileName, size, results: [] });
|
||||
}
|
||||
}
|
||||
// Start each new job — they'll acquire semaphores and run
|
||||
// Start each new job and track promises so batch-done waits for them
|
||||
for (const task of tasks) {
|
||||
this._runJob(task, results, signal);
|
||||
this._additionalPromises.push(this._runJob(task, results, signal));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user