Skip to content

fix(queue): list recovery projects without nextunique cursors on iOS Safari - #10229

Open
lstein wants to merge 1 commit into
mainfrom
fix/webkit-nextunique-cursor
Open

lstein wants to merge 1 commit into
mainfrom
fix/webkit-nextunique-cursor

Conversation

@lstein

@lstein lstein commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

On iOS Safari a persistent "Queue recovery storage is unavailable" banner appeared at the top of the app. The recovery notice lists projects with an index key cursor opened in the nextunique direction, which iOS WebKit rejects with UnknownError: Unable to open cursor. The error was reported as unavailable storage on every 10-second refresh.

The listing now walks the byProject index with a plain key cursor and continues past each project id (continue(id + '\u0000')), so it still visits one key per project. This was the only nextunique/prevunique cursor in the frontend.

Related Issues / Discussions

None.

QA Instructions

  • On iOS Safari, an in-page probe showed nextunique index cursors fail on both queueRuns and drafts, while plain openKeyCursor, openCursor and getAllKeys succeed.
  • With this branch served, the banner no longer appears on iOS Safari.
  • queueRunJournal.browser.test.ts and QueueRecoveryNotice.browser.test.tsx pass in Chromium and in Playwright WebKit (35/35 each; WebKit via a temporary config with instances: [{ browser: 'webkit' }]). The existing listing test records two runs for one project, so it covers duplicate skipping.
  • Playwright WebKit (Safari 27.2) does not reproduce the iOS failure: nextunique succeeds there. On a fixture with two projects it and the new cursor walk return the same ids.
  • tsc --noEmit, oxlint, oxfmt --check clean.

Review

No material findings. Desktop WebKit does not reproduce the iOS failure, so tests in either engine would not catch nextunique being reintroduced; a code comment records why it is avoided.

Checklist

  • The PR has a short but descriptive title, suitable for a changelog
  • Meaningful regression coverage added / updated where needed; obsolete tests/code removed
  • Persisted-state and API changes include required migrations / compatibility validation
  • Relevant performance/efficiency opportunities considered; material claims have evidence
  • Material review findings resolved and relevant checks rerun
  • Documentation added / updated (if applicable)
  • Updated What's New copy (if doing a release after this PR)

🤖 Generated with Claude Code

…Safari

iOS WebKit fails nextunique index cursors with "Unable to open cursor", so the
recovery notice always reported storage as unavailable. Walk the index with a
plain key cursor and continue past each project id instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lstein lstein added the 7.0.0 label Nov 10, 2026
@github-actions github-actions Bot added the frontend PRs that change frontend files label Nov 10, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

7.0.0 frontend PRs that change frontend files

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants