Last active
March 9, 2024 13:34
-
-
Save tralves/9e5de2bd9f582007a52708d7d4209865 to your computer and use it in GitHub Desktop.
Calculate sizes of all IndexDB database and tables
This file contains 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.webkitGetDatabaseNames().onsuccess = function (e) { | |
var databaseNames = e.target.result; | |
var dbName; | |
for(var i=0; i < databaseNames.length; i++) { | |
dbName = databaseNames.item(i); | |
getDatabaseSize(dbName); | |
}; | |
}; | |
} | |
//usage | |
printIndexDBSizes(); |
For better non-latin symbols support replace line 17 with size += new Blob([json]).size
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
We can use
indexedDB.databases();
to get all databases