fix download retry config and abort handling

This commit is contained in:
Ben Gauger 2026-04-02 13:06:29 -06:00
parent 6fddfba000
commit 6401021364

View File

@ -54,6 +54,11 @@ export class RunDownloadJob {
totalBytes: 0,
}
// Track whether cancellation was explicitly requested by the user (via Redis signal
// or in-process AbortController). BullMQ lock mismatches can also abort the download
// stream, but those should be retried — only user-initiated cancels are unrecoverable.
let userCancelled = false
// Poll Redis for cancel signal every 2s — independent of progress events so cancellation
// works even when the stream is stalled and no onProgress ticks are firing.
let cancelPollInterval: ReturnType<typeof setInterval> | null = setInterval(async () => {
@ -61,6 +66,7 @@ export class RunDownloadJob {
const val = await cancelRedis.get(RunDownloadJob.cancelKey(job.id!))
if (val) {
await cancelRedis.del(RunDownloadJob.cancelKey(job.id!))
userCancelled = true
abortController.abort()
}
} catch {
@ -176,8 +182,9 @@ export class RunDownloadJob {
filepath,
}
} catch (error: any) {
// If this was a cancellation abort, don't let BullMQ retry
if (error?.message?.includes('aborted') || error?.message?.includes('cancelled')) {
// Only prevent retries for user-initiated cancellations. BullMQ lock mismatches
// can also abort the stream, and those should be retried with backoff.
if (userCancelled) {
throw new UnrecoverableError(`Download cancelled: ${error.message}`)
}
throw error