handleProgress on a 'done' event with removeFromQueueOnDone=true was calling queueJobs.filter() once per event. With 500 parallel jobs all finishing at roughly the same time, that's 500 × O(N) = O(N²) work synchronously on the IPC handler thread — visible as a brief UI freeze when a big batch completes. Coalesce into one microtask: removeJobFromIndex + selection cleanup stay synchronous (so subsequent lookups see the right state), but the array rewrite is deferred to a single filter against a Set of all ids that came in this tick. JS microtask runs after the sync IPC batch, so within one batch-of-events we get one filter pass instead of N. beforeunload drains the pending set synchronously before persisting so removeFromQueueOnDone=true users don't see jobs reappear after restart that they expected to be gone. |
||
|---|---|---|
| .. | ||
| app.js | ||
| drop-target.html | ||
| index.html | ||
| styles.css | ||