transloadit/uppy · error · Error

Cannot mark a queued request as done: this indicates a bug

Error message

Cannot mark a queued request as done: this indicates a bug

What it means

An internal queued-request placeholder object throws if its done() method is ever called. The real queued request is swapped in later; calling done() on the placeholder means the request-tracking logic has a bug, not that you misconfigured anything.

Source

Thrown at packages/@uppy/tus/src/index.ts:435

          if (!this.requests.isPaused) {
            this.requests.pause()
            window.addEventListener(
              'online',
              () => {
                this.requests.resume()
              },
              { once: true },
            )
          }
        }
        queuedRequest.abort()
        queuedRequest = {
          shouldBeRequeued: true,
          abort() {
            this.shouldBeRequeued = false
          },
          done() {
            throw new Error(
              'Cannot mark a queued request as done: this indicates a bug',
            )
          },
          fn() {
            throw new Error('Cannot run a queued request: this indicates a bug')
          },
        }
        return true
      }

      if (onShouldRetry != null) {
        uploadOptions.onShouldRetry = (
          error: tus.DetailedError,
          retryAttempt: number,
        ) => onShouldRetry(error, retryAttempt, opts, defaultOnShouldRetry)
      } else {
        uploadOptions.onShouldRetry = defaultOnShouldRetry
      }

View on GitHub (pinned to 5d4dedd02a)

Solutions

  1. Update to the latest @uppy/tus — report it on the Uppy GitHub issues with a reproduction if it persists
  2. Avoid programmatically aborting and immediately resuming the same file in the same tick
  3. If reproducible, reduce opts.limit concurrency to lower queue churn
Defensive patterns

Strategy: fallback

Try / catch

try { await uppy.upload() } catch (err) { if (err.message.includes('queued request')) await uppy.retryAll(); else throw err }

Prevention

When it happens

Trigger: A code path in the Tus plugin's internal queue marks the temporary placeholder request (created after an abort while a request is queued) as completed before the real request replaces it.

Common situations: Extremely rapid abort/resume cycles during uploads with limit-based queuing; generally only encountered as an internal plugin bug report, not through normal API use.

Related errors


AI-assisted analysis of transloadit/uppy@5d4dedd02a (2026-08-28). Data as JSON: /api/errors/c8a5a0928ab65f41. Report an issue: GitHub.