{"record":{"id":"6f5ed9f950363bec","repo":"transloadit/uppy","slug":"no-space-left","errorCode":null,"errorMessage":"No space left","messagePattern":"No space left","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"packages/@uppy/golden-retriever/src/IndexedDBStore.ts","lineNumber":231,"sourceCode":"          resolve(size)\n        }\n      }\n      request.onerror = () => {\n        reject(new Error('Could not retrieve stored blobs size'))\n      }\n    })\n  }\n\n  /**\n   * Save a file in the store.\n   */\n  async put<T>(file: AddFilePayload): Promise<T> {\n    if (file.data.size != null && file.data.size > this.opts.maxFileSize) {\n      throw new Error('File is too big to store.')\n    }\n    const size = await this.getSize()\n    if (size > this.opts.maxTotalSize) {\n      throw new Error('No space left')\n    }\n    const db = await this.#ready\n    const transaction = db.transaction([STORE_NAME], 'readwrite')\n    const request = transaction.objectStore(STORE_NAME).add({\n      id: this.key(file.id),\n      fileID: file.id,\n      store: this.name,\n      expires: Date.now() + this.opts.expires,\n      data: file.data,\n    })\n    return waitForRequest(request)\n  }\n\n  /**\n   * Delete a file blob from the store.\n   */\n  async delete(fileID: UppyFileId): Promise<unknown> {\n    const db = await this.#ready","sourceCodeStart":213,"sourceCodeEnd":249,"githubUrl":"https://github.com/transloadit/uppy/blob/5d4dedd02a1ac0ae022c75c54aca76558f88e256/packages/@uppy/golden-retriever/src/IndexedDBStore.ts#L213-L249","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nconst store = new IndexedDBStore() // 50MB total default -> 'No space left'\n\n// after\nconst store = new IndexedDBStore({\n  maxTotalSize: 300 * 1024 * 1024,\n  expires: 24 * 60 * 60 * 1000, // purge after 1 day\n})","handlingStrategy":"try-catch","validationCode":"const size = await store.getSize()\nif (size > maxTotalSize) {\n  await cleanupExpired(store) // or skip persistence this round\n} else {\n  await store.put(file)\n}","typeGuard":"null","tryCatchPattern":"try {\n  await store.put(file)\n} catch (err) {\n  if (err.message === 'No space left') {\n    await store.deleteAll?.() // or prune oldest entries\n  }\n}","preventionTips":["Set an expires option so stale blobs are purged","Monitor cumulative store size before writes","Raise maxTotalSize deliberately, not accidentally"],"tags":["golden-retriever","indexeddb","quota","storage-full"],"backgroundTag":"client-storage-quota-exceeded","analyzedSha":"5d4dedd02a1ac0ae022c75c54aca76558f88e256","analyzedAt":"2026-08-28T12:18:41.267Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}