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.#ready

View on GitHub (pinned to 5d4dedd02a)

Solutions

  1. Catch this error around persistence and treat files as non-recoverable (uploads still succeed)
  2. Increase maxTotalSize (and be mindful of the browser's real IndexedDB quota)
  3. Ensure the store cleans expired entries — use the expires option / GoldenRetriever's cleanup so old blobs are purged
  4. 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

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.