UNPKG

ng-indexed-db

Version:

An IndexedDB Angular module wrapped in RXJS

314 lines 18.8 kB
/** * @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