indexeddb-js
Welcome to the indexeddb-js
javascript/node-js module: a
pure-javascript stop-gap implementation of the IndexedDB (aka. Indexed
Database) API. Being "stop-gap", it currently does not implement all
IndexedDB API features and can only use
sqlite3 as a data storage
back-end.
Just To Be Clear
This module is not intended to provide a "production" level
implementation: it is a "stop-gap" measure while we (the community)
wait for a more robust/native implementation for node-js. As such, it
was created to allow unit-testing of other projects (such as
syncml-js and others), which
require that you provide access to an indexedDB API, but need to be
unit-tested in any environment, including non-browser environments.
If time permits, and/or others are willing to contribute, it may
one day graduate to a less "stop-gap" measure.
What Isn't Implemented
There are many IndexedDB API items that are not implemented, which
include but are not limited to:
-
True transaction support, i.e. transaction isolation, aborting
(rollback), and transaction events (oncomplete).
-
Proper meta-information upgrade management.
-
Many of the dynamic public API properties of various object types.
-
Compliance with any of the DOMException errors.
-
Many non-critical APIs, including:
- indexedDB.deleteDatabase()
- indexedDB.cmp()
- Transaction.abort()
- Store.deleteIndex()
- Cursor.update()
- Cursor.advance()
- Cursor.delete()
-
Performance and efficiency (it was implemented one Saturday
afternoon).
-
Non-sqlite3 data stores.
Installation
This is the easy part, provided you have npm
installed:
npm install indexeddb-js sqlite3
Usage
A quick example of how to use indexeddb-js
:
var engine = new sqlite3.Database(':memory:');
var scope = indexeddbjs.makeScope('sqlite3', engine);
var request = scope.indexedDB.open('MyDatabase');
var db = null;
request.onerror = function(event) {
console.log('ERROR: could not open database: ' + event.target.error);
};
request.onupgradeneeded = function(event) {
db = event.target.result;
var store = db.createObjectStore('data', {keyPath: 'id'});
store.createIndex('value', 'value', {unique: false});
store.add({id: 1, value: 'my-first-item'});
};
request.onsuccess = function(event) {
db = event.target.result;
request.run();
};
request.run = function() {
db.onerror = function(event) {
console.log('DATABASE ERROR: ' + event.target.error);
};
var store = db.transaction(null, 'readwrite').objectStore('data');
store.get('1').onsuccess = function(event) {
var obj = event.target.result;
console.log('record: ' + JSON.stringify(obj));
store.delete('1').onsuccess = function(event) {
console.log('deleted the record');
store.put({id: '2', value: 'another object'}).onsuccess = function(event) {
store.put({id: 3, value: 'another object'}).onsuccess = function(event) {
console.log('added two more records');
play_with_the_index_and_cursors();
};
};
};
};
var play_with_the_index_and_cursors = function() {
var index = db.transaction(null, 'readwrite').objectStore('data').index('value');
var range = scope.IDBKeyRange.only('another object');
console.log('all objects with the "value" field set to "another object":');
index.openCursor(range).onsuccess = function(event) {
var cursor = event.target.result;
if ( ! cursor )
return;
console.log(' - ' + JSON.stringify(cursor.value));
cursor.continue();
};
};
};
The output on the console from the above script should be:
record: {"id":1,"value":"my-first-item"}
deleted the record
added two more records
all objects with the "value" field set to "another object":
- {"id":"2","value":"another object"}
- {"id":3,"value":"another object"}
Note that indexeddb-js
implements the Indexed Database API as
accurately as possible, so just
google for the specification and
many good tutorials. My favorite:
Tests
indexeddb-js
uses jasmine for
the testing infrastructure; in the indexeddb-js directory:
npm install jasmine-node
make tests