UNPKG

@creasource/reactive-idb

Version:

A reactive wrapper to indexedDb using Rxjs

175 lines 12.4 kB
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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