transloadit/uppy · warning · Error
No space left
Error message
No space left
What it means
IndexedDBStore.put throws 'No space left' when the total size already stored (getSize()) exceeds the store's maxTotalSize option (default ~50MB for Golden Retriever's IndexedDB store). It is a quota-style guard: the persistence layer is full, so nothing more will be saved until old entries are cleaned up.
Source
Thrown at packages/@uppy/golden-retriever/src/IndexedDBStore.ts:231
resolve(size)
}
}
request.onerror = () => {
reject(new Error('Could not retrieve stored blobs size'))
}
})
}
/**
* Save a file in the store.
*/
async put<T>(file: AddFilePayload): Promise<T> {
if (file.data.size != null && file.data.size > this.opts.maxFileSize) {
throw new Error('File is too big to store.')
}
const size = await this.getSize()
if (size > this.opts.maxTotalSize) {
throw new Error('No space left')
}
const db = await this.#ready
const transaction = db.transaction([STORE_NAME], 'readwrite')
const request = transaction.objectStore(STORE_NAME).add({
id: this.key(file.id),
fileID: file.id,
store: this.name,
expires: Date.now() + this.opts.expires,
data: file.data,
})
return waitForRequest(request)
}
/**
* Delete a file blob from the store.
*/
async delete(fileID: UppyFileId): Promise<unknown> {
const db = await this.#readyView on GitHub (pinned to 5d4dedd02a)
Solutions
- Catch this error around persistence and treat files as non-recoverable (uploads still succeed)
- Increase maxTotalSize (and be mindful of the browser's real IndexedDB quota)
- Ensure the store cleans expired entries — use the expires option / GoldenRetriever's cleanup so old blobs are purged
- Periodically call store.list/delete or clear stale state between sessions
Example fix
// before
const store = new IndexedDBStore() // 50MB total default -> 'No space left'
// after
const store = new IndexedDBStore({
maxTotalSize: 300 * 1024 * 1024,
expires: 24 * 60 * 60 * 1000, // purge after 1 day
}) Defensive patterns
Strategy: try-catch
Validate before calling
const size = await store.getSize()
if (size > maxTotalSize) {
await cleanupExpired(store) // or skip persistence this round
} else {
await store.put(file)
} Type guard
null
Try / catch
try {
await store.put(file)
} catch (err) {
if (err.message === 'No space left') {
await store.deleteAll?.() // or prune oldest entries
}
} Prevention
- Set an expires option so stale blobs are purged
- Monitor cumulative store size before writes
- Raise maxTotalSize deliberately, not accidentally
When it happens
Trigger: Golden Retriever persisting during an upload while cumulative size of previously stored files exceeds maxTotalSize; common after several uploads in one session or when old expired blobs were never cleaned.
Common situations: Frequent uploads accumulate beyond the default total cap; expired-file cleanup not running (store not given an expires or cleanup schedule); maxTotalSize left at default while maxFileSize was raised.
Related errors
AI-assisted analysis of transloadit/uppy@5d4dedd02a (2026-08-28).
Data as JSON: /api/errors/6f5ed9f950363bec.
Report an issue: GitHub.