@creasource/reactive-idb
Version:
A reactive wrapper to indexedDb using Rxjs
175 lines • 12.4 kB
JavaScript
import { Observable } from 'rxjs';
import { ReactiveIDBObjectStore } from './reactive-idb-object-store';
import { ReactiveIDBTransaction } from './reactive-idb-transaction';
export class ReactiveIDBDatabase {
/**
* @param database
*/
constructor(database) {
this.database = database;
}
/**
* Returns the name of the database.
*/
get name() {
return this.database.name;
}
/**
* Returns a list of the names of object stores in the database.
*/
get objectStoreNames() {
return this.database.objectStoreNames;
}
/**
* Returns the version of the database.
*/
get version() {
return this.database.version;
}
/**
*
* @param options
*/
static create(options) {
return new Observable((subscriber) => {
const opts = {
schema: [],
factory: window.indexedDB,
onUpgrade: () => void 0,
onBlocked: () => void 0,
autoCloseOnVersionChange: true,
...options,
};
const version = Math.max(...opts.schema.map((schema) => schema.version), 1);
const request = opts.factory.open(opts.name, version);
request.onupgradeneeded = (versionChange) => {
const database = request.result;
opts.schema
.filter((schema) => schema.version > versionChange.oldVersion)
.forEach((schema) => {
const stores = schema.stores;
stores.forEach((store) => {
let name, options, indexes;
if (typeof store === 'string') {
name = store;
options = {};
indexes = [];
}
else {
name = store.name;
options = store.options;
indexes = (store.indexes || []).map((index) => {
return typeof index === 'string'
? { name: index, keyPath: index }
: index;
});
}
const objStore = database.createObjectStore(name, options);
indexes.forEach((index) => objStore.createIndex(index.name, index.keyPath || index.name, index.options));
});
});
opts.onUpgrade(database, versionChange.oldVersion, versionChange.newVersion, versionChange.target
.transaction);
};
request.onsuccess = () => {
if (opts.autoCloseOnVersionChange) {
request.result.addEventListener('versionchange', () => {
request.result.close();
});
}
subscriber.next(new ReactiveIDBDatabase(request.result));
subscriber.complete();
};
if (options.onBlocked) {
request.onblocked = options.onBlocked;
}
request.onerror = (ev) => subscriber.error(ev);
});
}
/**
* Closes the connection once all running transactions have finished.
*/
close() {
return this.database.close();
}
/**
* Returns a new transaction with the given mode ("readonly" or "readwrite") and scope which can be a single object store name or an array of names.
*/
transaction(names, mode) {
return new ReactiveIDBTransaction(this.database.transaction(names, mode), this);
}
/**
*
* @param names
* @param mode
*/
transaction$(names, mode) {
return new Observable((observer) => {
const transaction = new ReactiveIDBTransaction(this.database.transaction(names, mode), this);
transaction.addEventListener('complete', () => observer.complete());
observer.next(transaction);
return () => {
try {
transaction.abort();
// eslint-disable-next-line no-empty
}
catch (e) { }
};
});
}
/**
* Creates a new object store with the given name and options and returns a new IDBObjectStore.
*
* Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
*/
createObjectStore(name, options) {
const objStore = this.database.createObjectStore(name, options);
const transaction = objStore.transaction;
return new ReactiveIDBObjectStore(objStore, new ReactiveIDBTransaction(transaction, this));
}
/**
* Deletes the object store with the given name.
*
* Throws a "InvalidStateError" DOMException if not called within an upgrade transaction.
*/
deleteObjectStore(name) {
return this.database.deleteObjectStore(name);
}
/**
*
* @param type
* @param listener
* @param options
*/
addEventListener(type, listener, options) {
this.database.addEventListener(type, listener, options);
}
/**
*
* @param type
* @param listener
* @param options
*/
removeEventListener(type, listener, options) {
this.database.removeEventListener(type, listener, options);
}
/**
*
* @param onBlocked
*/
clear$(onBlocked) {
return new Observable((observer) => {
this.database.close();
const request = indexedDB.deleteDatabase(this.name);
request.onerror = (event) => observer.error(event);
request.onsuccess = () => {
observer.next();
observer.complete();
};
if (onBlocked) {
request.onblocked = onBlocked;
}
});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtaWRiLWRhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWFjdGl2ZS1pZGItZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQWtFcEUsTUFBTSxPQUFPLG1CQUFtQjtJQXNCOUI7O09BRUc7SUFDSCxZQUE2QixRQUFxQjtRQUFyQixhQUFRLEdBQVIsUUFBUSxDQUFhO0lBQUcsQ0FBQztJQXhCdEQ7O09BRUc7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQy9CLENBQUM7SUFPRDs7O09BR0c7SUFDSCxNQUFNLENBQUMsTUFBTSxDQUNYLE9BQW1DO1FBRW5DLE9BQU8sSUFBSSxVQUFVLENBQXNCLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDeEQsTUFBTSxJQUFJLEdBQXlDO2dCQUNqRCxNQUFNLEVBQUUsRUFBRTtnQkFDVixPQUFPLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQ3pCLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3ZCLHdCQUF3QixFQUFFLElBQUk7Z0JBQzlCLEdBQUcsT0FBTzthQUNYLENBQUM7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