This is a pure JS in-memory implementation of the IndexedDB API.
It passes the W3C IndexedDB test suite (a feat that all browsers except Chrome fail) plus a couple hundred more tests just to be sure. It also works well enough to run fairly complex IndexedDB-based software.
For use with CommonJS (Node.js/io.js/Browserify), install through npm:
$ npm install fake-indexeddb
Otherwise, download the bundled version and include it in your page like:
<script type="text/javascript" src="fakeIndexedDB.js"></script>
If you're using AMD, you'll have to shim it.
Functionally, it works exactly like IndexedDB except data is not persisted to disk.
Example usage:
var fakeIndexedDB = require('fake-indexeddb');
var FDBKeyRange = require('fake-indexeddb/lib/FDBKeyRange');
var request = fakeIndexedDB.open('test', 3);
request.onupgradeneeded = function () {
var db = request.result;
var store = db.createObjectStore("books", {keyPath: "isbn"});
store.createIndex("by_title", "title", {unique: true});
store.put({title: "Quarry Memories", author: "Fred", isbn: 123456});
store.put({title: "Water Buffaloes", author: "Fred", isbn: 234567});
store.put({title: "Bedrock Nights", author: "Barney", isbn: 345678});
}
request.onsuccess = function (event) {
var db = event.target.result;
var tx = db.transaction("books");
tx.objectStore("books").index("by_title").get("Quarry Memories").addEventListener('success', function (event) {
console.log('From index:', event.target.result);
});
tx.objectStore("books").openCursor(FDBKeyRange.lowerBound(200000)).onsuccess = function (event) {
var cursor = event.target.result;
if (cursor) {
console.log('From cursor:', cursor.value);
cursor.continue();
}
};
tx.oncomplete = function () {
console.log('All done!');
};
};
Variable names of all the objects are like the normal IndexedDB ones except with F replacing I, e.g. FDBIndex
instead of IDBIndex
.
If you're using the bundled version (not installed through npm), then all of the variables are created and attached to window
, like window.fakeIndexedDB
, window.FDBKeyRange
, etc.
-
Use as a mock database in unit tests.
-
Use the same API in Node.js/io.js and in the browser.
-
Support IndexedDB in old or crappy browsers.
-
Somehow use it within a caching layer on top of IndexedDB in the browser, since IndexedDB can be kind of slow.
-
Abstract the core database functions out, so what is left is a shell that allows the IndexedDB API to easily sit on top of many different backends.
-
Serve as a playground for experimenting with IndexedDB.
Apache 2.0