From a542fdf42dba7ae7e8b2e86ab9e2ea9e976dbc52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Kooi?= Date: Thu, 28 Sep 2017 12:28:57 +0200 Subject: [PATCH] restore: Implement cleanup for expired blobs. --- src/plugins/RestoreFiles/IndexedDBStore.js | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/plugins/RestoreFiles/IndexedDBStore.js b/src/plugins/RestoreFiles/IndexedDBStore.js index ea8e452ba..e9fce005a 100644 --- a/src/plugins/RestoreFiles/IndexedDBStore.js +++ b/src/plugins/RestoreFiles/IndexedDBStore.js @@ -1,3 +1,4 @@ +const prettyBytes = require('prettier-bytes') const indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB const isSupported = !!indexedDB @@ -175,6 +176,38 @@ class IndexedDBStore { return waitForRequest(request) }) } + + /** + * Delete all stored blobs that have an expiry date that is before Date.now(). + * This is a static method because it deletes expired blobs from _all_ Uppy instances. + */ + static cleanup () { + return connect(DB_NAME).then((db) => { + const transaction = db.transaction([STORE_NAME], 'readwrite') + const store = transaction.objectStore(STORE_NAME) + const request = store.index('expires') + .openCursor(IDBKeyRange.upperBound(Date.now())) + return new Promise((resolve, reject) => { + request.onsuccess = (event) => { + const cursor = event.target.result + if (cursor) { + const entry = cursor.value + console.log( + '[IndexedDBStore] Deleting record', entry.fileID, + 'of size', prettyBytes(entry.data.size), + '- expired on', new Date(entry.expires)) + cursor.delete() // Ignoring return value … it's not terrible if this goes wrong. + cursor.continue() + } else { + resolve() + } + } + request.onerror = reject + }) + }).then((db) => { + db.close() + }) + } } IndexedDBStore.isSupported = isSupported