-
-
Save huanle0610/a591d233e42747a90a55f4c25935df0d to your computer and use it in GitHub Desktop.
Calculate sizes of all IndexDB database and tables
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var getTableSize = function (db, dbName) { | |
return new Promise((resolve, reject) => { | |
if (db == null) { | |
return reject(); | |
} | |
var size = 0; | |
db = event.target.result; | |
var transaction = db.transaction([dbName]) | |
.objectStore(dbName) | |
.openCursor(); | |
transaction.onsuccess = function (event) { | |
var cursor = event.target.result; | |
if (cursor) { | |
var storedObject = cursor.value; | |
var json = JSON.stringify(storedObject); | |
size += json.length; | |
cursor.continue(); | |
} else { | |
resolve(size); | |
} | |
}.bind(this); | |
transaction.onerror = function (err) { | |
reject("error in " + dbName + ": " + err); | |
} | |
}); | |
}; | |
var getDatabaseSize = function (dbName) { | |
var request = indexedDB.open(dbName); | |
var db; | |
var dbSize = 0; | |
request.onerror = function (event) { | |
alert("Why didn't you allow my web app to use IndexedDB?!"); | |
}; | |
request.onsuccess = function (event) { | |
db = event.target.result; | |
var tableNames = [...db.objectStoreNames]; | |
(function (tableNames, db) { | |
var tableSizeGetters = tableNames | |
.reduce((acc, tableName) => { | |
acc.push(getTableSize(db, tableName)); | |
return acc; | |
}, []); | |
Promise.all(tableSizeGetters) | |
.then(sizes => { | |
console.log('--------- ' + db.name + ' -------------'); | |
tableNames.forEach((tableName, i) => { | |
console.log(" - " + tableName + "\t: " + humanReadableSize(sizes[i])); | |
}); | |
var total = sizes.reduce(function (acc, val) { | |
return acc + val; | |
}, 0); | |
console.log("TOTAL: " + humanReadableSize(total)) | |
}); | |
})(tableNames, db); | |
}; | |
}; | |
var humanReadableSize = function (bytes) { | |
var thresh = 1024; | |
if (Math.abs(bytes) < thresh) { | |
return bytes + ' B'; | |
} | |
var units = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; | |
var u = -1; | |
do { | |
bytes /= thresh; | |
++u; | |
} while (Math.abs(bytes) >= thresh && u < units.length - 1); | |
return bytes.toFixed(1) + ' ' + units[u]; | |
}; | |
var printIndexDBSizes = function () { | |
indexedDB.databases().then(v => v.reduce((acc, cur) => (acc.push(cur.name), acc), [])) | |
.then(databaseNames => { | |
var dbName; | |
for (var i = 0; i < databaseNames.length; i++) { | |
dbName = databaseNames[i]; | |
getDatabaseSize(dbName); | |
} | |
}) | |
}; | |
//usage | |
printIndexDBSizes(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment