UNPKG

ng-indexed-db

Version:

An IndexedDB Angular module wrapped in RXJS

277 lines 18 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { Observable, forkJoin, timer } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject'; import { IndexedDatabase } from '../indexed-database'; var NgDatabaseFactory = /** @class */ (function () { function NgDatabaseFactory() { /** * Emits an event when all databases recive has been generated */ this.connectionsReady = new BehaviorSubject(false); /** * Indexed database connection factory */ this.factory = window.indexedDB; } /** * Sends the database metadata to create. * Once it has been completed, emits the * connectionsReady event * @param databases Databases metadata */ /** * Sends the database metadata to create. * Once it has been completed, emits the * connectionsReady event * @param {?} databases Databases metadata * @return {?} */ NgDatabaseFactory.prototype.createConnnections = /** * Sends the database metadata to create. * Once it has been completed, emits the * connectionsReady event * @param {?} databases Databases metadata * @return {?} */ function (databases) { var _this = this; this.createDataBases(databases) .pipe(map((/** * @param {?} response * @return {?} */ function (response) { return _this.connections = response; })), switchMap((/** * @param {?} response * @return {?} */ function (response) { return timer(100); }))) .subscribe((/** * @return {?} */ function () { return _this.connectionsReady.next(true); })); }; /** * Find a database connection by name. If there isn't * a database name takes the default database name * @param dbName Name of the database alias */ /** * Find a database connection by name. If there isn't * a database name takes the default database name * @param {?=} dbName Name of the database alias * @return {?} */ NgDatabaseFactory.prototype.getDatabase = /** * Find a database connection by name. If there isn't * a database name takes the default database name * @param {?=} dbName Name of the database alias * @return {?} */ function (dbName) { return this.connections[dbName ? dbName : this.defaultConnectionName]; }; /** * Open a database connection * @param dbName name of the database * @param version version of the database */ /** * Open a database connection * @param {?} dbName name of the database * @param {?=} version version of the database * @return {?} */ NgDatabaseFactory.prototype.open = /** * Open a database connection * @param {?} dbName name of the database * @param {?=} version version of the database * @return {?} */ function (dbName, version) { var _this = this; return new Observable((/** * @param {?} observer * @return {?} */ function (observer) { /** @type {?} */ var upgraded = false; /** @type {?} */ var DBOpenRequest = _this.factory.open(dbName, version); DBOpenRequest.onupgradeneeded = (/** * @param {?} event * @return {?} */ function (event) { observer.next({ upgraded: true, success: true, result: DBOpenRequest.result }); observer.complete(); upgraded = true; }); DBOpenRequest.onsuccess = (/** * @param {?} event * @return {?} */ function (event) { if (!upgraded) { observer.next({ upgraded: false, success: true, result: DBOpenRequest.result }); observer.complete(); } }); DBOpenRequest.onerror = (/** * @param {?} event * @return {?} */ function (event) { observer.error("Error to connect database " + dbName); observer.complete(); }); DBOpenRequest.onblocked = (/** * @param {?} event * @return {?} */ function (event) { console.log('blocked'); }); })); }; /** * Generates an Observable collection of database connections * @param Databases metadata */ /** * Generates an Observable collection of database connections * @param {?} databases * @return {?} */ NgDatabaseFactory.prototype.createDataBases = /** * Generates an Observable collection of database connections * @param {?} databases * @return {?} */ function (databases) { var _this = this; /** @type {?} */ var operators = []; /** @type {?} */ var firstIteration = true; /** @type {?} */ var createConnnection = (/** * @param {?} item * @return {?} */ function (item) { if (firstIteration) { _this.defaultConnectionName = item.name; firstIteration = false; } operators.push(_this.createConnection(item.name, item.stores, 1)); }); databases.forEach(createConnnection); /** @type {?} */ var mappingResponse = (/** * @param {?} response * @return {?} */ function (response) { /** @type {?} */ var data = {}; response.forEach((/** * @param {?} item * @return {?} */ function (item) { data = tslib_1.__assign({}, data, item); })); return data; }); return forkJoin(operators) .pipe(map(mappingResponse)); }; /** * Generates a sigle database conecction client */ /** * Generates a sigle database conecction client * @private * @param {?} dbName * @param {?} tables * @param {?=} version * @return {?} */ NgDatabaseFactory.prototype.createConnection = /** * Generates a sigle database conecction client * @private * @param {?} dbName * @param {?} tables * @param {?=} version * @return {?} */ function (dbName, tables, version) { return this.open(dbName, version) .pipe(map((/** * @param {?} data * @return {?} */ function (data) { var _a; return (_a = {}, _a[dbName] = new IndexedDatabase(data.result, data.upgraded, tables), _a); }))); }; NgDatabaseFactory.decorators = [ { type: Injectable } ]; return NgDatabaseFactory; }()); export { NgDatabaseFactory }; if (false) { /** * Emits an event when all databases recive has been generated * @type {?} */ NgDatabaseFactory.prototype.connectionsReady; /** * Indexed database connection factory * @type {?} * @private */ NgDatabaseFactory.prototype.factory; /** * List of all connections handled by the service * @type {?} * @private */ NgDatabaseFactory.prototype.connections; /** * Default connection name * @type {?} * @private */ NgDatabaseFactory.prototype.defaultConnectionName; } /** * @record */ function OpenConnectionResponse() { } if (false) { /** @type {?} */ OpenConnectionResponse.prototype.success; /** @type {?} */ OpenConnectionResponse.prototype.upgraded; /** @type {?} */ OpenConnectionResponse.prototype.result; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWluZGV4ZWQtZGIvIiwic291cmNlcyI6WyJsaWIvY29yZS9mYWN0b3J5L2RhdGFiYXNlLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUtoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdEQ7SUFBQTs7OztRQUlFLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFNLEtBQUssQ0FBQyxDQUFDOzs7O1FBRzNDLFlBQU8sR0FBZSxNQUFNLENBQUMsU0FBUyxDQUFDO0lBaUhqRCxDQUFDO0lBekdDOzs7OztPQUtHOzs7Ozs7OztJQUNILDhDQUFrQjs7Ozs7OztJQUFsQixVQUFtQixTQUF1QjtRQUExQyxpQkFPQztRQU5DLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDO2FBQzlCLElBQUksQ0FDSCxHQUFHOzs7O1FBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxLQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsRUFBM0IsQ0FBMkIsRUFBQyxFQUM1QyxTQUFTOzs7O1FBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQVYsQ0FBVSxFQUFDLENBQ2xDO2FBQ0EsU0FBUzs7O1FBQUMsY0FBTSxPQUFBLEtBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQWhDLENBQWdDLEVBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQ0Q7Ozs7T0FJRzs7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LDRDQUFnQjs7Ozs7Ozs7SUFBeEIsVUFBeUIsTUFBYyxFQUFFLE1BQWlCLEVBQUUsT0FBZ0I7UUFDMUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7YUFDOUIsSUFBSSxDQUNILEdBQUc7Ozs7UUFBQyxVQUFBLElBQUk7O1lBQUksT0FBQSxVQUFFLEdBQUMsTUFBTSxJQUFHLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsS0FBRTtRQUFyRSxDQUFxRSxFQUFDLENBQ25GLENBQUM7SUFDTixDQUFDOztnQkF2SEYsVUFBVTs7SUF3SFgsd0JBQUM7Q0FBQSxBQXhIRCxJQXdIQztTQXZIWSxpQkFBaUI7Ozs7OztJQUc1Qiw2Q0FBbUQ7Ozs7OztJQUduRCxvQ0FBK0M7Ozs7OztJQUcvQyx3Q0FBa0M7Ozs7OztJQUdsQyxrREFBc0M7Ozs7O0FBNkd4QyxxQ0FJQzs7O0lBSEMseUNBQWlCOztJQUNqQiwwQ0FBa0I7O0lBQ2xCLHdDQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzL2ludGVybmFsL0JlaGF2aW9yU3ViamVjdCc7XG5cbmltcG9ydCB7IE5nQ29ubmVjdGlvbiB9IGZyb20gJy4uL3R5cGVzL2NvbmVjY3Rpb24udHlwZSc7XG5pbXBvcnQgeyBOZ0RhdGFCYXNlIH0gZnJvbSAnLi4vdHlwZXMvZGF0YWJhc2UudHlwZSc7XG5pbXBvcnQgeyBOZ1N0b3JlIH0gZnJvbSAnLi4vdHlwZXMvc3RvcmUudHlwZSc7XG5pbXBvcnQgeyBJbmRleGVkRGF0YWJhc2UgfSBmcm9tICcuLi9pbmRleGVkLWRhdGFiYXNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nRGF0YWJhc2VGYWN0b3J5IHtcblxuICAvKiogRW1pdHMgYW4gZXZlbnQgd2hlbiBhbGwgZGF0YWJhc2VzIHJlY2l2ZSBoYXMgYmVlbiBnZW5lcmF0ZWQgKi9cbiAgY29ubmVjdGlvbnNSZWFkeSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihmYWxzZSk7XG5cbiAgLyoqIEluZGV4ZWQgZGF0YWJhc2UgY29ubmVjdGlvbiBmYWN0b3J5ICovXG4gIHByaXZhdGUgZmFjdG9yeTogSURCRmFjdG9yeSA9IHdpbmRvdy5pbmRleGVkREI7XG5cbiAgLyoqIExpc3Qgb2YgYWxsIGNvbm5lY3Rpb25zIGhhbmRsZWQgYnkgdGhlIHNlcnZpY2UgKi9cbiAgcHJpdmF0ZSBjb25uZWN0aW9uczogTmdDb25uZWN0aW9uO1xuXG4gIC8qKiBEZWZhdWx0IGNvbm5lY3Rpb24gbmFtZSAqL1xuICBwcml2YXRlIGRlZmF1bHRDb25uZWN0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgZGF0YWJhc2UgbWV0YWRhdGEgdG8gY3JlYXRlLlxuICAgKiBPbmNlIGl0IGhhcyBiZWVuIGNvbXBsZXRlZCwgZW1pdHMgdGhlXG4gICAqIGNvbm5lY3Rpb25zUmVhZHkgZXZlbnRcbiAgICogQHBhcmFtIGRhdGFiYXNlcyBEYXRhYmFzZXMgbWV0YWRhdGFcbiAgICovXG4gIGNyZWF0ZUNvbm5uZWN0aW9ucyhkYXRhYmFzZXM6IE5nRGF0YUJhc2VbXSkge1xuICAgIHRoaXMuY3JlYXRlRGF0YUJhc2VzKGRhdGFiYXNlcylcbiAgICAucGlwZShcbiAgICAgIG1hcChyZXNwb25zZSA9PiB0aGlzLmNvbm5lY3Rpb25zID0gcmVzcG9uc2UpLFxuICAgICAgc3dpdGNoTWFwKHJlc3BvbnNlID0+IHRpbWVyKDEwMCkpLFxuICAgIClcbiAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY29ubmVjdGlvbnNSZWFkeS5uZXh0KHRydWUpKTtcbiAgfVxuICAvKipcbiAgICogRmluZCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gYnkgbmFtZS4gSWYgdGhlcmUgaXNuJ3RcbiAgICogYSBkYXRhYmFzZSBuYW1lIHRha2VzIHRoZSBkZWZhdWx0IGRhdGFiYXNlIG5hbWVcbiAgICogQHBhcmFtIGRiTmFtZSBOYW1lIG9mIHRoZSBkYXRhYmFzZSBhbGlhc1xuICAgKi9cbiAgZ2V0RGF0YWJhc2UoZGJOYW1lPzogc3RyaW5nKTogSW5kZXhlZERhdGFiYXNlIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uc1tkYk5hbWUgPyBkYk5hbWUgOiB0aGlzLmRlZmF1bHRDb25uZWN0aW9uTmFtZV07XG4gIH1cbiAgLyoqXG4gICAqIE9wZW4gYSBkYXRhYmFzZSBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSBkYk5hbWUgbmFtZSBvZiB0aGUgZGF0YWJhc2VcbiAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBvZiB0aGUgZGF0YWJhc2VcbiAgICovXG4gIG9wZW4oZGJOYW1lOiBzdHJpbmcsIHZlcnNpb24/OiBudW1iZXIpOiBPYnNlcnZhYmxlPE9wZW5Db25uZWN0aW9uUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUob2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IHVwZ3JhZGVkID0gZmFsc2U7XG4gICAgICBjb25zdCBEQk9wZW5SZXF1ZXN0OiBJREJPcGVuREJSZXF1ZXN0ID0gdGhpcy5mYWN0b3J5Lm9wZW4oZGJOYW1lLCB2ZXJzaW9uKTtcblxuICAgICAgREJPcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSBldmVudCA9PiB7XG4gICAgICAgIG9ic2VydmVyLm5leHQoe1xuICAgICAgICAgIHVwZ3JhZGVkOiB0cnVlLFxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgcmVzdWx0OiBEQk9wZW5SZXF1ZXN0LnJlc3VsdFxuICAgICAgICB9KTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgdXBncmFkZWQgPSB0cnVlO1xuICAgICAgfTtcblxuICAgICAgREJPcGVuUmVxdWVzdC5vbnN1Y2Nlc3MgPSBldmVudCA9PiB7XG4gICAgICAgIGlmICghdXBncmFkZWQpIHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KHtcbiAgICAgICAgICAgIHVwZ3JhZGVkOiBmYWxzZSxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICByZXN1bHQ6IERCT3BlblJlcXVlc3QucmVzdWx0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgREJPcGVuUmVxdWVzdC5vbmVycm9yID0gZXZlbnQgPT4ge1xuICAgICAgICBvYnNlcnZlci5lcnJvcihgRXJyb3IgdG8gY29ubmVjdCBkYXRhYmFzZSAke2RiTmFtZX1gKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH07XG5cbiAgICAgIERCT3BlblJlcXVlc3Qub25ibG9ja2VkID0gZXZlbnQgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnYmxvY2tlZCcpO1xuICAgICAgfTtcblxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4gT2JzZXJ2YWJsZSBjb2xsZWN0aW9uIG9mIGRhdGFiYXNlIGNvbm5lY3Rpb25zXG4gICAqIEBwYXJhbSBEYXRhYmFzZXMgbWV0YWRhdGFcbiAgICovXG4gIGNyZWF0ZURhdGFCYXNlcyhkYXRhYmFzZXM6IE5nRGF0YUJhc2VbXSk6IE9ic2VydmFibGU8TmdDb25uZWN0aW9uPiB7XG4gICAgY29uc3Qgb3BlcmF0b3JzID0gW107XG4gICAgbGV0IGZpcnN0SXRlcmF0aW9uID0gdHJ1ZTtcbiAgICBjb25zdCBjcmVhdGVDb25ubmVjdGlvbiA9IChpdGVtOiBOZ0RhdGFCYXNlKSA9PiB7XG4gICAgICBpZiAoZmlyc3RJdGVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0Q29ubmVjdGlvbk5hbWUgPSBpdGVtLm5hbWU7XG4gICAgICAgIGZpcnN0SXRlcmF0aW9uID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBvcGVyYXRvcnMucHVzaCh0aGlzLmNyZWF0ZUNvbm5lY3Rpb24oaXRlbS5uYW1lLCBpdGVtLnN0b3JlcywgMSkpO1xuICAgIH07XG4gICAgZGF0YWJhc2VzLmZvckVhY2goY3JlYXRlQ29ubm5lY3Rpb24pO1xuXG4gICAgY29uc3QgbWFwcGluZ1Jlc3BvbnNlID0gcmVzcG9uc2UgPT4ge1xuICAgICAgbGV0IGRhdGEgPSB7fTtcbiAgICAgIHJlc3BvbnNlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgIGRhdGEgPSB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAuLi5pdGVtXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcbiAgICByZXR1cm4gZm9ya0pvaW4ob3BlcmF0b3JzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChtYXBwaW5nUmVzcG9uc2UpXG4gICAgICApO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBzaWdsZSBkYXRhYmFzZSBjb25lY2N0aW9uIGNsaWVudFxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVDb25uZWN0aW9uKGRiTmFtZTogc3RyaW5nLCB0YWJsZXM6IE5nU3RvcmVbXSwgdmVyc2lvbj86IG51bWJlcik6IE9ic2VydmFibGU8TmdDb25uZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbihkYk5hbWUsIHZlcnNpb24pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKGRhdGEgPT4gKHtbZGJOYW1lXTogbmV3IEluZGV4ZWREYXRhYmFzZShkYXRhLnJlc3VsdCwgZGF0YS51cGdyYWRlZCwgdGFibGVzKX0pKVxuICAgICAgKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgT3BlbkNvbm5lY3Rpb25SZXNwb25zZSB7XG4gIHN1Y2Nlc3M6IGJvb2xlYW47XG4gIHVwZ3JhZGVkOiBib29sZWFuO1xuICByZXN1bHQ6IElEQkRhdGFiYXNlO1xufVxuIl19