Skip to content

fix(core): store assets as raw bytes instead of File objects in Index… - #912

Open
DoudouDoudouk wants to merge 2 commits into
pascalorg:mainfrom
DoudouDoudouk:fix/asset-storage-webkit
Open

DoudouDoudouk wants to merge 2 commits into
pascalorg:mainfrom
DoudouDoudouk:fix/asset-storage-webkit

Conversation

@DoudouDoudouk

@DoudouDoudouk DoudouDoudouk commented Sep 23, 2026 •

Copy link
Copy Markdown

…edDB

saveAsset put the File itself into IndexedDB. Not every engine accepts File/Blob records (WebKit rejects the write), so every upload that goes through saveAsset failed there with no fallback.

Store { assetVersion: 1, bytes, type } instead, which uses the portable structured-clone path. loadAssetUrl rebuilds a Blob from that record, still reads File/Blob records written before this change, and returns null for an unreadable record instead of throwing inside createObjectURL.

What does this PR do?

How to test

Screenshots / screen recording

Checklist

  • I've tested this locally with bun dev
  • My code follows the existing code style (run bun check to verify)
  • I've updated relevant documentation (if applicable)
  • This PR targets the main branch

Note

Medium Risk
Changes how all local asset uploads are persisted and loaded, but behavior stays the same for callers and legacy data is still supported.

Overview
Fixes asset uploads failing on engines (notably WebKit) that reject storing File/Blob values in IndexedDB.

saveAsset now persists a versioned record { assetVersion: 1, bytes, type } instead of the File itself, using structured-clone-friendly ArrayBuffer data while preserving MIME type for later blob URLs.

loadAssetUrl reconstructs a Blob from that record via a new toBlob path, still reads legacy File/Blob entries written before this format, and returns null (with a warning) for corrupt or unexpected records instead of blowing up in createObjectURL.

Tests cover the new storage shape, backward compatibility, and unreadable-record handling.

Reviewed by Cursor Bugbot for commit f4f96dc. Bugbot is set up for automated code reviews on this repo. Configure here.

…edDB

saveAsset put the File itself into IndexedDB. Not every engine accepts
File/Blob records (WebKit rejects the write), so every upload that goes
through saveAsset failed there with no fallback.

Store { assetVersion: 1, bytes, type } instead, which uses the portable
structured-clone path. loadAssetUrl rebuilds a Blob from that record,
still reads File/Blob records written before this change, and returns
null for an unreadable record instead of throwing inside createObjectURL.
@pascal

pascal Bot commented Sep 23, 2026

Copy link
Copy Markdown

I hit an error while handling your request (Model unavailable on AI Gateway free tier: Free tier users do not have access to this model. Upgrade to paid credits at https://vercel.com/d?to=%2F%5Bteam%5D%2F%7E%2Fai%3Fmodal%3Dtop-up for unrestricted…).

Please try again, rephrase, or reach out if it keeps failing.

Error id: 550823bd-bd72-4994-9e26-6cad61eb3629

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant