ng-indexed-db
Version:
An IndexedDB Angular module wrapped in RXJS
314 lines • 18.8 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
*/
var /**
* IndexedDB client
*/
IndexedDatabase = /** @class */ (function () {
function IndexedDatabase(database, upgraded, stores) {
if (stores === void 0) { stores = []; }
this.database = database;
this.upgraded = upgraded;
this.createTables(stores);
}
/**
* If table has been upgrades, generates the recived stores
* @param tables Tables metadata
*/
/**
* If table has been upgrades, generates the recived stores
* @param {?} tables Tables metadata
* @return {?}
*/
IndexedDatabase.prototype.createTables = /**
* If table has been upgrades, generates the recived stores
* @param {?} tables Tables metadata
* @return {?}
*/
function (tables) {
var _this = this;
if (this.upgraded) {
tables.forEach((/**
* @param {?} item
* @return {?}
*/
function (item) { return _this.createTable(item); }));
}
};
/**
* Generates one single sotre
* @param storeName Store name
*/
/**
* Generates one single sotre
* @param {?} store
* @return {?}
*/
IndexedDatabase.prototype.createTable = /**
* Generates one single sotre
* @param {?} store
* @return {?}
*/
function (store) {
/** @type {?} */
var keyPath = 'id';
this.database.createObjectStore(store.name, { keyPath: keyPath });
};
/**
* Request a list with all store elements
* @param storeName Store name
*/
/**
* Request a list with all store elements
* @template M
* @param {?} storeName Store name
* @return {?}
*/
IndexedDatabase.prototype.list = /**
* Request a list with all store elements
* @template M
* @param {?} storeName Store name
* @return {?}
*/
function (storeName) {
var _this = this;
return new Observable((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var store = _this.store(storeName, TransactionModes.READONLY);
/** @type {?} */
var request = store.getAll();
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.next(request.result); });
request.onerror = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.error(request.error); });
}));
};
/**
* Request a single object found by the given key
* @param storeName Store name
* @param key Predicate key
*/
/**
* Request a single object found by the given key
* @template M
* @param {?} storeName Store name
* @param {?} key Predicate key
* @return {?}
*/
IndexedDatabase.prototype.get = /**
* Request a single object found by the given key
* @template M
* @param {?} storeName Store name
* @param {?} key Predicate key
* @return {?}
*/
function (storeName, key) {
var _this = this;
return new Observable((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var store = _this.store(storeName, TransactionModes.READONLY);
/** @type {?} */
var request = store.get(key);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.next(request.result); });
request.onerror = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.error(request.error); });
}));
};
/**
* Request to store an element
* @param storeName Store name
* @param data data to store
*/
/**
* Request to store an element
* @template M
* @param {?} storeName Store name
* @param {?} data data to store
* @return {?}
*/
IndexedDatabase.prototype.create = /**
* Request to store an element
* @template M
* @param {?} storeName Store name
* @param {?} data data to store
* @return {?}
*/
function (storeName, data) {
var _this = this;
return new Observable((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var store = _this.store(storeName, TransactionModes.READWRITE);
/** @type {?} */
var request = store.put(data);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.next(data); });
request.onerror = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.error(request.error); });
}));
};
/**
* Request to update an element
* @param storeName Store name
* @param data data to store
*/
/**
* Request to update an element
* @template M
* @param {?} storeName Store name
* @param {?} data data to store
* @return {?}
*/
IndexedDatabase.prototype.update = /**
* Request to update an element
* @template M
* @param {?} storeName Store name
* @param {?} data data to store
* @return {?}
*/
function (storeName, data) {
var _this = this;
return new Observable((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var store = _this.store(storeName, TransactionModes.READWRITE);
/** @type {?} */
var request = store.put(data);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.next(data); });
request.onerror = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.error(request.error); });
}));
};
/**
* Request to delete an element with the given key
* @param storeName Store name
* @param key Element key to delete
*/
/**
* Request to delete an element with the given key
* @param {?} storeName Store name
* @param {?} key Element key to delete
* @return {?}
*/
IndexedDatabase.prototype.delete = /**
* Request to delete an element with the given key
* @param {?} storeName Store name
* @param {?} key Element key to delete
* @return {?}
*/
function (storeName, key) {
var _this = this;
return new Observable((/**
* @param {?} observer
* @return {?}
*/
function (observer) {
/** @type {?} */
var store = _this.store(storeName, TransactionModes.READWRITE);
/** @type {?} */
var request = store.delete(key);
request.onsuccess = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.next(true); });
request.onerror = (/**
* @param {?} event
* @return {?}
*/
function (event) { return observer.error(request.error); });
}));
};
/**
* Find the a store table by the given name
* @param storeName Store name to find
* @param mode Transaction mode
*/
/**
* Find the a store table by the given name
* @private
* @param {?} storeName Store name to find
* @param {?} mode Transaction mode
* @return {?}
*/
IndexedDatabase.prototype.store = /**
* Find the a store table by the given name
* @private
* @param {?} storeName Store name to find
* @param {?} mode Transaction mode
* @return {?}
*/
function (storeName, mode) {
/** @type {?} */
var transaction = this.database.transaction(storeName, mode);
/** @type {?} */
var store = transaction.objectStore(storeName);
return store;
};
return IndexedDatabase;
}());
/**
* IndexedDB client
*/
export { IndexedDatabase };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZC1kYXRhYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWluZGV4ZWQtZGIvIiwic291cmNlcyI6WyJsaWIvY29yZS9pbmRleGVkLWRhdGFiYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7O0FBSzdEOzs7O0lBUUUseUJBQ0UsUUFBcUIsRUFDckIsUUFBaUIsRUFDakIsTUFBc0I7UUFBdEIsdUJBQUEsRUFBQSxXQUFzQjtRQUV0QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRDs7O09BR0c7Ozs7OztJQUNILHNDQUFZOzs7OztJQUFaLFVBQWEsTUFBaUI7UUFBOUIsaUJBSUM7UUFIQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsTUFBTSxDQUFDLE9BQU87Ozs7WUFBQyxVQUFBLElBQUksSUFBSSxPQUFBLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQXRCLENBQXNCLEVBQUMsQ0FBQztTQUNoRDtJQUNILENBQUM7SUFDRDs7O09BR0c7Ozs7OztJQUNILHFDQUFXOzs7OztJQUFYLFVBQVksS0FBYzs7WUFDbEIsT0FBTyxHQUFHLElBQUk7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxTQUFBLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRDs7O09BR0c7Ozs7Ozs7SUFDSCw4QkFBSTs7Ozs7O0lBQUosVUFBYyxTQUFpQjtRQUEvQixpQkFPQztRQU5DLE9BQU8sSUFBSSxVQUFVOzs7O1FBQU0sVUFB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QztJQUNEOzs7O09BSUc7Ozs7Ozs7SUFDSCxnQ0FBTTs7Ozs7O0lBQU4sVUFBTyxTQUFpQixFQUFFLEdBQWdCO1FBQTFDLGlCQU9DO1FBTkMsT0FBTyxJQUFJLFVBQVU7Ozs7UUFBVSxVQUFBLFFBQVE7O2dCQUMvQixLQUFLLEdBQUcsS0FBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDOztnQkFDekQsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTOzs7O1lBQUcsVUFBQSxLQUFLLElBQUksT0FBQSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFuQixDQUFtQixDQUFBLENBQUM7WUFDakQsT0FBTyxDQUFDLE9BQU87Ozs7WUFBRyxVQUFBLEtBQUssSUFBSSxPQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUE3QixDQUE2QixDQUFBLENBQUM7UUFDM0QsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0Q7Ozs7T0FJRzs7Ozs7Ozs7SUFDSywrQkFBSzs7Ozs7OztJQUFiLFVBQWMsU0FBaUIsRUFBRSxJQUFzQjs7WUFDL0MsV0FBVyxHQUFtQixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDOztZQUN4RSxLQUFLLEdBQW1CLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ2hFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQyxBQTVHRCxJQTRHQzs7Ozs7Ozs7Ozs7SUF6R0MsbUNBQThCOzs7Ozs7SUFHOUIsbUNBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBUcmFuc2FjdGlvbk1vZGVzIH0gZnJvbSAnLi9lbnVtcy90cmFuc2FjdGlvbi1tb2Rlcyc7XG5pbXBvcnQgeyBOZ1N0b3JlIH0gZnJvbSAnLi90eXBlcy9zdG9yZS50eXBlJztcbi8qKlxuICogSW5kZXhlZERCIGNsaWVudFxuICovXG5leHBvcnQgY2xhc3MgSW5kZXhlZERhdGFiYXNlIHtcblxuICAvKiogSW5kZXhlZEJEIGluc3RhbmNlICovXG4gIHByaXZhdGUgZGF0YWJhc2U6IElEQkRhdGFiYXNlO1xuXG4gIC8qKiBJbmRpY2F0ZXMgaWYgZGF0YWJhc2VzIGhhcyBiZWVuIHVwZ3JhZGVkICovXG4gIHByaXZhdGUgdXBncmFkZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YWJhc2U6IElEQkRhdGFiYXNlLFxuICAgIHVwZ3JhZGVkOiBib29sZWFuLFxuICAgIHN0b3JlczogTmdTdG9yZVtdID0gW11cbiAgKSB7XG4gICAgdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlO1xuICAgIHRoaXMudXBncmFkZWQgPSB1cGdyYWRlZDtcbiAgICB0aGlzLmNyZWF0ZVRhYmxlcyhzdG9yZXMpO1xuICB9XG4gIC8qKlxuICAgKiBJZiB0YWJsZSBoYXMgYmVlbiB1cGdyYWRlcywgZ2VuZXJhdGVzIHRoZSByZWNpdmVkIHN0b3Jlc1xuICAgKiBAcGFyYW0gdGFibGVzIFRhYmxlcyBtZXRhZGF0YVxuICAgKi9cbiAgY3JlYXRlVGFibGVzKHRhYmxlczogTmdTdG9yZVtdKSB7XG4gICAgaWYgKHRoaXMudXBncmFkZWQpIHtcbiAgICAgIHRhYmxlcy5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5jcmVhdGVUYWJsZShpdGVtKSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgb25lIHNpbmdsZSBzb3RyZVxuICAgKiBAcGFyYW0gc3RvcmVOYW1lIFN0b3JlIG5hbWVcbiAgICovXG4gIGNyZWF0ZVRhYmxlKHN0b3JlOiBOZ1N0b3JlKSB7XG4gICAgY29uc3Qga2V5UGF0aCA9ICdpZCc7XG4gICAgdGhpcy5kYXRhYmFzZS5jcmVhdGVPYmplY3RTdG9yZShzdG9yZS5uYW1lLCB7IGtleVBhdGggfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSBsaXN0IHdpdGggYWxsIHN0b3JlIGVsZW1lbnRzXG4gICAqIEBwYXJhbSBzdG9yZU5hbWUgU3RvcmUgbmFtZVxuICAgKi9cbiAgbGlzdDxNID0gYW55PihzdG9yZU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8TVtdPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPE1bXT4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlKHN0b3JlTmFtZSwgVHJhbnNhY3Rpb25Nb2Rlcy5SRUFET05MWSk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IG9ic2VydmVyLm5leHQocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgcmVxdWVzdC5vbmVycm9yID0gZXZlbnQgPT4gb2JzZXJ2ZXIuZXJyb3IocmVxdWVzdC5lcnJvcik7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSBzaW5nbGUgb2JqZWN0IGZvdW5kIGJ5IHRoZSBnaXZlbiBrZXlcbiAgICogQHBhcmFtIHN0b3JlTmFtZSBTdG9yZSBuYW1lXG4gICAqIEBwYXJhbSBrZXkgUHJlZGljYXRlIGtleVxuICAgKi9cbiAgZ2V0PE0gPSBhbnk+KHN0b3JlTmFtZTogc3RyaW5nLCBrZXk6IGFueSk6IE9ic2VydmFibGU8TT4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxNPihvYnNlcnZlciA9PiB7XG4gICAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmUoc3RvcmVOYW1lLCBUcmFuc2FjdGlvbk1vZGVzLlJFQURPTkxZKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZXZlbnQgPT4gb2JzZXJ2ZXIubmV4dChyZXF1ZXN0LnJlc3VsdCk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiBvYnNlcnZlci5lcnJvcihyZXF1ZXN0LmVycm9yKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogUmVxdWVzdCB0byBzdG9yZSBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSBzdG9yZU5hbWUgU3RvcmUgbmFtZVxuICAgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHN0b3JlXG4gICAqL1xuICBjcmVhdGU8TSA9IGFueT4oc3RvcmVOYW1lOiBzdHJpbmcsIGRhdGE6IE0pOiBPYnNlcnZhYmxlPE0+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TT4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlKHN0b3JlTmFtZSwgVHJhbnNhY3Rpb25Nb2Rlcy5SRUFEV1JJVEUpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLnB1dChkYXRhKTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZXZlbnQgPT4gb2JzZXJ2ZXIubmV4dChkYXRhKTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IGV2ZW50ID0+IG9ic2VydmVyLmVycm9yKHJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIHVwZGF0ZSBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSBzdG9yZU5hbWUgU3RvcmUgbmFtZVxuICAgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIHN0b3JlXG4gICAqL1xuICB1cGRhdGU8TSA9IGFueT4oc3RvcmVOYW1lOiBzdHJpbmcsIGRhdGE6IE0pOiBPYnNlcnZhYmxlPE0+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8TT4ob2JzZXJ2ZXIgPT4ge1xuICAgICAgY29uc3Qgc3RvcmUgPSB0aGlzLnN0b3JlKHN0b3JlTmFtZSwgVHJhbnNhY3Rpb25Nb2Rlcy5SRUFEV1JJVEUpO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLnB1dChkYXRhKTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gZXZlbnQgPT4gb2JzZXJ2ZXIubmV4dChkYXRhKTtcbiAgICAgIHJlcXVlc3Qub25lcnJvciA9IGV2ZW50ID0+IG9ic2VydmVyLmVycm9yKHJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRvIGRlbGV0ZSBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIGtleVxuICAgKiBAcGFyYW0gc3RvcmVOYW1lIFN0b3JlIG5hbWVcbiAgICogQHBhcmFtIGtleSBFbGVtZW50IGtleSB0byBkZWxldGVcbiAgICovXG4gIGRlbGV0ZShzdG9yZU5hbWU6IHN0cmluZywga2V5OiBJREJWYWxpZEtleSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxib29sZWFuPihvYnNlcnZlciA9PiB7XG4gICAgICBjb25zdCBzdG9yZSA9IHRoaXMuc3RvcmUoc3RvcmVOYW1lLCBUcmFuc2FjdGlvbk1vZGVzLlJFQURXUklURSk7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGV2ZW50ID0+IG9ic2VydmVyLm5leHQodHJ1ZSk7XG4gICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBldmVudCA9PiBvYnNlcnZlci5lcnJvcihyZXF1ZXN0LmVycm9yKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmluZCB0aGUgYSBzdG9yZSB0YWJsZSBieSB0aGUgZ2l2ZW4gbmFtZVxuICAgKiBAcGFyYW0gc3RvcmVOYW1lIFN0b3JlIG5hbWUgdG8gZmluZFxuICAgKiBAcGFyYW0gbW9kZSBUcmFuc2FjdGlvbiBtb2RlXG4gICAqL1xuICBwcml2YXRlIHN0b3JlKHN0b3JlTmFtZTogc3RyaW5nLCBtb2RlOiBUcmFuc2FjdGlvbk1vZGVzKTogSURCT2JqZWN0U3RvcmUge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBJREJUcmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBtb2RlKTtcbiAgICBjb25zdCBzdG9yZTogSURCT2JqZWN0U3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfVxufVxuIl19