alyssaxuu/screenity · error · Error

Drive resumable upload finished without final response

Error message

Drive resumable upload finished without final response

What it means

The upload loop completed all chunks (or stopped after stall/abort handling) but never received Drive's terminating 200/201 response containing the file resource, so the uploaded file's ID is unknown. Thrown as the final post-loop guard in uploadResumable.

Source

Thrown at src/pages/Background/drive/handleSaveToDrive.js:270

    }
    // Drive accepted none of the chunk. Resending the same range is correct,
    // but bound it so a persistently stalled upload fails instead of looping.
    stalledRounds += 1;
    if (stalledRounds >= MAX_STALL_ROUNDS) {
      throw new Error(
        `Drive resumable upload made no progress at offset ${offset}`
      );
    }
    const stallDelay = Math.min(1000 * Math.pow(2, stalledRounds - 1), 15000);
    diagEvent("drive-chunk-stall", {
      offset,
      round: stalledRounds,
      delayMs: stallDelay,
    });
    await new Promise((r) => setTimeout(r, stallDelay));
  }

  throw new Error("Drive resumable upload finished without final response");
};

const isAuthError = (err) => {
  const msg = String(err?.message || err || "");
  return / 401\b/.test(msg) || /401 /.test(msg);
};

// Map a Drive failure to a stable code the editor turns into a specific
// message. The reason strings come from Drive's 403/400 JSON body, which we
// already carry in the thrown message but used to discard client-side.
const classifyDriveError = (err) => {
  const msg = String(err?.message || err || "");
  // storageQuotaExceeded is the account-full reason. Drive also returns
  // "Quota exceeded for quota metric ..." for API rate limits, which is
  // transient, so don't match that loosely or a rate limit tells the user
  // their Drive is full.
  if (/storageQuotaExceeded/i.test(msg)) {
    return "drive-quota";

View on GitHub (pinned to 512606387b)

Solutions

  1. Query the resumable session with PUT Content-Range: bytes */size to elicit the final 201 response and file ID
  2. If the session is gone (410), list the Screenity folder for the sanitized filename to recover the ID
  3. Retry finalization with backoff; only re-upload if the session is unrecoverable
Defensive patterns

Strategy: retry

When it happens

Trigger: Thrown at src/pages/Background/drive/handleSaveToDrive.js:270 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of alyssaxuu/screenity@512606387b (2026-09-02). Data as JSON: /api/errors/8c350d8dcc5c5508. Report an issue: GitHub.