ng-indexed-db
Version:
An IndexedDB Angular module wrapped in RXJS
217 lines • 15.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Observable } from 'rxjs';
import { TransactionModes } from './enums/transaction-modes';
/**
* IndexedDB client
*/
export class IndexedDatabase {
/**
* @param {?} database
* @param {?} upgraded
* @param {?=} stores
*/
constructor(database, upgraded, stores = []) {
this.database = database;
this.upgraded = upgraded;
this.createTables(stores);
}
/**
* If table has been upgrades, generates the recived stores
* @param {?} tables Tables metadata
* @return {?}
*/
createTables(tables) {
if (this.upgraded) {
tables.forEach((/**
* @param {?} item
* @return {?}
*/
item => this.createTable(item)));
}
}
/**
* Generates one single sotre
* @param {?} store
* @return {?}
*/
createTable(store) {
/** @type {?} */
const keyPath = 'id';
this.database.createObjectStore(store.name, { keyPath });
}
/**
* Request a list with all store elements
* @template M
* @param {?} storeName Store name
* @return {?}
*/
list(storeName) {
return new Observable((/**
* @param {?} observer
* @return {?}
*/
observer => {
/** @type {?} */
const store = this.store(storeName, TransactionModes.READONLY);
/** @type {?} */
const request = store.getAll();
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
event => observer.next(request.result));
request.onerror = (/**
* @param {?} event
* @return {?}
*/
event => observer.error(request.error));
}));
}
/**
* Request a single object found by the given key
* @template M
* @param {?} storeName Store name
* @param {?} key Predicate key
* @return {?}
*/
get(storeName, key) {
return new Observable((/**
* @param {?} observer
* @return {?}
*/
observer => {
/** @type {?} */
const store = this.store(storeName, TransactionModes.READONLY);
/** @type {?} */
const request = store.get(key);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
event => observer.next(request.result));
request.onerror = (/**
* @param {?} event
* @return {?}
*/
event => observer.error(request.error));
}));
}
/**
* Request to store an element
* @template M
* @param {?} storeName Store name
* @param {?} data data to store
* @return {?}
*/
create(storeName, data) {
return new Observable((/**
* @param {?} observer
* @return {?}
*/
observer => {
/** @type {?} */
const store = this.store(storeName, TransactionModes.READWRITE);
/** @type {?} */
const request = store.put(data);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
event => observer.next(data));
request.onerror = (/**
* @param {?} event
* @return {?}
*/
event => observer.error(request.error));
}));
}
/**
* Request to update an element
* @template M
* @param {?} storeName Store name
* @param {?} data data to store
* @return {?}
*/
update(storeName, data) {
return new Observable((/**
* @param {?} observer
* @return {?}
*/
observer => {
/** @type {?} */
const store = this.store(storeName, TransactionModes.READWRITE);
/** @type {?} */
const request = store.put(data);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
event => observer.next(data));
request.onerror = (/**
* @param {?} event
* @return {?}
*/
event => observer.error(request.error));
}));
}
/**
* Request to delete an element with the given key
* @param {?} storeName Store name
* @param {?} key Element key to delete
* @return {?}
*/
delete(storeName, key) {
return new Observable((/**
* @param {?} observer
* @return {?}
*/
observer => {
/** @type {?} */
const store = this.store(storeName, TransactionModes.READWRITE);
/** @type {?} */
const request = store.delete(key);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
event => observer.next(true));
request.onerror = (/**
* @param {?} event
* @return {?}
*/
event => observer.error(request.error));
}));
}
/**
* Find the a store table by the given name
* @private
* @param {?} storeName Store name to find
* @param {?} mode Transaction mode
* @return {?}
*/
store(storeName, mode) {
/** @type {?} */
const transaction = this.database.transaction(storeName, mode);
/** @type {?} */
const store = transaction.objectStore(storeName);
return store;
}
}
if (false) {
/**
* IndexedBD instance
* @type {?}
* @private
*/
IndexedDatabase.prototype.database;
/**
* Indicates if databases has been upgraded
* @type {?}
* @private
*/
IndexedDatabase.prototype.upgraded;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZC1kYXRhYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWluZGV4ZWQtZGIvIiwic291cmNlcyI6WyJsaWIvY29yZS9pbmRleGVkLWRhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBSzdELE1BQU0sT0FBTyxlQUFlOzs7Ozs7SUFRMUIsWUFDRSxRQUFxQixFQUNyQixRQUFpQixFQUNqQixTQUFvQixFQUFFO1FBRXRCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsQ0FBQzs7Ozs7O0lBS0QsWUFBWSxDQUFDLE1BQWlCO1FBQzVCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixNQUFNLENBQUMsT0FBTzs7OztZQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQzs7Ozs7O0lBS0QsV0FBVyxDQUFDLEtBQWM7O2NBQ2xCLE9BQU8sR0FBRyxJQUFJO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQzs7Ozs7OztJQUtELElBQUksQ0FBVSxTQUFpQjtRQUM3QixPQUFPLElBQUksVUFBVTs7OztRQUFNLFFBQVEsQ0FBQyxFQUFFOztrQkFDOUIsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsQ0FBQzs7a0JBQ3hELE9BQU8sR0FBRyxLQUFLLENB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Q2pELE9BQU8sQ0FBQyxPQUFPOzs7O1lBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQSxDQUFDO1FBQzNELENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7Ozs7SUFNTyxLQUFLLENBQUMsU0FBaUIsRUFBRSxJQUFzQjs7Y0FDL0MsV0FBVyxHQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDOztjQUN4RSxLQUFLLEdBQW1CLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ2hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGOzs7Ozs7O0lBekdDLG1DQUE4Qjs7Ozs7O0lBRzlCLG1DQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgVHJhbnNhY3Rpb25Nb2RlcyB9IGZyb20gJy4vZW51bXMvdHJhbnNhY3Rpb24tbW9kZXMnO1xuaW1wb3J0IHsgTmdTdG9yZSB9IGZyb20gJy4vdHlwZXMvc3RvcmUudHlwZSc7XG4vKipcbiAqIEluZGV4ZWREQiBjbGllbnRcbiAqL1xuZXhwb3J0IGNsYXNzIEluZGV4ZWREYXRhYmFzZSB7XG5cbiAgLyoqIEluZGV4ZWRCRCBpbnN0YW5jZSAqL1xuICBwcml2YXRlIGRhdGFiYXNlOiBJREJEYXRhYmFzZTtcblxuICAvKiogSW5kaWNhdGVzIGlmIGRhdGFiYXNlcyBoYXMgYmVlbiB1cGdyYWRlZCAqL1xuICBwcml2YXRlIHVwZ3JhZGVkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhdGFiYXNlOiBJREJEYXRhYmFzZSxcbiAgICB1cGdyYWRlZDogYm9vbGVhbixcbiAgICBzdG9yZXM6IE5nU3RvcmVbXSA9IFtdXG4gICkge1xuICAgIHRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTtcbiAgICB0aGlzLnVwZ3JhZGVkID0gdXBncmFkZWQ7XG4gICAgdGhpcy5jcmVhdGVUYWJsZXMoc3RvcmVzKTtcbiAgfVxuICAvKipcbiAgICogSWYgdGFibGUgaGFzIGJlZW4gdXBncmFkZXMsIGdlbmVyYXRlcyB0aGUgcmVjaXZlZCBzdG9yZXNcbiAgICogQHBhcmFtIHRhYmxlcyBUYWJsZXMgbWV0YWRhdGFcbiAgICovXG4gIGNyZWF0ZVRhYmxlcyh0YWJsZXM6IE5nU3RvcmVbXSkge1xuICAgIGlmICh0aGlzLnVwZ3JhZGVkKSB7XG4gICAgICB0YWJsZXMuZm9yRWFjaChpdGVtID0+IHRoaXMuY3JlYXRlVGFibGUoaXRlbSkpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGVzIG9uZSBzaW5nbGUgc290cmVcbiAgICogQHBhcmFtIHN0b3JlTmFtZSBTdG9yZSBuYW1lXG4gICAqL1xuICBjcmVhdGVUYWJsZShzdG9yZTogTmdTdG9yZSkge1xuICAgIGNvbnN0IGtleVBhdGggPSAnaWQnO1xuICAgIHRoaXMuZGF0YWJhc2UuY3JlYXRlT2JqZWN0U3RvcmUoc3RvcmUubmFtZSwgeyBrZXlQYXRoIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgbGlzdCB3aXRoIGFsbCBzdG9yZSBlbGVtZW50c1xuICAgKiBAcGFyYW0gc3RvcmVOYW1lIFN0b3JlIG5hbWVcbiAgICovXG4gIGxpc3Q8TSA9IGFueT4oc3RvcmVOYW1lOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1bXT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxNW10+KG9ic2VydmVyID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZShzdG9yZU5hbWUsIFRyYW5zYWN0aW9uTW9kZXMuUkVBRE9OTFkpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldEFsbCgpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBldmVudCA9PiBvYnNlcnZlci5uZXh0KHJlcXVlc3QucmVzdWx0KTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IGV2ZW50ID0+IG9ic2VydmVyLmVycm9yKHJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgc2luZ2xlIG9iamVjdCBmb3VuZCBieSB0aGUgZ2l2ZW4ga2V5XG4gICAqIEBwYXJhbSBzdG9yZU5hbWUgU3RvcmUgbmFtZVxuICAgKiBAcGFyYW0ga2V5IFByZWRpY2F0ZSBrZXlcbiAgICovXG4gIGdldDxNID0gYW55PihzdG9yZU5hbWU6IHN0cmluZywga2V5OiBhbnkpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TT4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlKHN0b3JlTmFtZSwgVHJhbnNhY3Rpb25Nb2Rlcy5SRUFET05MWSk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IG9ic2VydmVyLm5leHQocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gZXZlbnQgPT4gb2JzZXJ2ZXIuZXJyb3IocmVxdWVzdC5lcnJvcik7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlcXVlc3QgdG8gc3RvcmUgYW4gZWxlbWVudFxuICAgKiBAcGFyYW0gc3RvcmVOYW1lIFN0b3JlIG5hbWVcbiAgICogQHBhcmFtIGRhdGEgZGF0YSB0byBzdG9yZVxuICAgKi9cbiAgY3JlYXRlPE0gPSBhbnk+KHN0b3JlTmFtZTogc3RyaW5nLCBkYXRhOiBNKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE0+KG9ic2VydmVyID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZShzdG9yZU5hbWUsIFRyYW5zYWN0aW9uTW9kZXMuUkVBRFdSSVRFKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wdXQoZGF0YSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IG9ic2VydmVyLm5leHQoZGF0YSk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiBvYnNlcnZlci5lcnJvcihyZXF1ZXN0LmVycm9yKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmVxdWVzdCB0byB1cGRhdGUgYW4gZWxlbWVudFxuICAgKiBAcGFyYW0gc3RvcmVOYW1lIFN0b3JlIG5hbWVcbiAgICogQHBhcmFtIGRhdGEgZGF0YSB0byBzdG9yZVxuICAgKi9cbiAgdXBkYXRlPE0gPSBhbnk+KHN0b3JlTmFtZTogc3RyaW5nLCBkYXRhOiBNKTogT2JzZXJ2YWJsZTxNPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE0+KG9ic2VydmVyID0+IHtcbiAgICAgIGNvbnN0IHN0b3JlID0gdGhpcy5zdG9yZShzdG9yZU5hbWUsIFRyYW5zYWN0aW9uTW9kZXMuUkVBRFdSSVRFKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wdXQoZGF0YSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IG9ic2VydmVyLm5leHQoZGF0YSk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiBvYnNlcnZlci5lcnJvcihyZXF1ZXN0LmVycm9yKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmVxdWVzdCB0byBkZWxldGUgYW4gZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBrZXlcbiAgICogQHBhcmFtIHN0b3JlTmFtZSBTdG9yZSBuYW1lXG4gICAqIEBwYXJhbSBrZXkgRWxlbWVudCBrZXkgdG8gZGVsZXRlXG4gICAqL1xuICBkZWxldGUoc3RvcmVOYW1lOiBzdHJpbmcsIGtleTogSURCVmFsaWRLZXkpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8Ym9vbGVhbj4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlKHN0b3JlTmFtZSwgVHJhbnNhY3Rpb25Nb2Rlcy5SRUFEV1JJVEUpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSBldmVudCA9PiBvYnNlcnZlci5uZXh0KHRydWUpO1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gZXZlbnQgPT4gb2JzZXJ2ZXIuZXJyb3IocmVxdWVzdC5lcnJvcik7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGEgc3RvcmUgdGFibGUgYnkgdGhlIGdpdmVuIG5hbWVcbiAgICogQHBhcmFtIHN0b3JlTmFtZSBTdG9yZSBuYW1lIHRvIGZpbmRcbiAgICogQHBhcmFtIG1vZGUgVHJhbnNhY3Rpb24gbW9kZVxuICAgKi9cbiAgcHJpdmF0ZSBzdG9yZShzdG9yZU5hbWU6IHN0cmluZywgbW9kZTogVHJhbnNhY3Rpb25Nb2Rlcyk6IElEQk9iamVjdFN0b3JlIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbjogSURCVHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlLnRyYW5zYWN0aW9uKHN0b3JlTmFtZSwgbW9kZSk7XG4gICAgY29uc3Qgc3RvcmU6IElEQk9iamVjdFN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICByZXR1cm4gc3RvcmU7XG4gIH1cbn1cbiJdfQ==