Skip to content

Instantly share code, notes, and snippets.

@huanle0610
Forked from tralves/get_indexdb_sizes.js
Last active February 11, 2020 03:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save huanle0610/a591d233e42747a90a55f4c25935df0d to your computer and use it in GitHub Desktop.
Save huanle0610/a591d233e42747a90a55f4c25935df0d to your computer and use it in GitHub Desktop.
Calculate sizes of all IndexDB database and tables
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