Run a task serialized with other thumbnail tasks — only one runs at a time
across the whole app. Use this to wrap expensive thumbnail generation work
(file downloads + canvas decoding) so cards don't fetch in parallel.
Pass an AbortSignal so tasks whose consumer has gone away (unmounted
card, changed filter) are skipped instead of blocking the queue, and rely
on the built-in timeout so a single hung task can't wedge every other
thumbnail behind it.
Run a task serialized with other thumbnail tasks — only one runs at a time across the whole app. Use this to wrap expensive thumbnail generation work (file downloads + canvas decoding) so cards don't fetch in parallel.
Pass an
AbortSignalso tasks whose consumer has gone away (unmounted card, changed filter) are skipped instead of blocking the queue, and rely on the built-in timeout so a single hung task can't wedge every other thumbnail behind it.