ngx-indexed-database
Version:
<div align="center"> <img src="https://w3c.github.io/IndexedDB/logo-db.svg" width="120"/> </div> <h1 align="center">ngx-indexed-database</h1>
85 lines • 14.4 kB
JavaScript
import { __awaiter } from "tslib";
import { Injectable } from '@angular/core';
import { InvalidArgumentsException } from "../exceptions/InvalidArgumentsException";
import { HelperUtils } from "../utils/helper.utils";
import { PrimaryKeysCountException } from "../exceptions/PrimaryKeysCountException";
import { IndexedDBKeysDataType } from "../enums/IndexedDBKeysDataType";
import { NgxIndexedDatabaseStoreSchemaService } from "./ngx-indexed-database-store-schema.service";
import { SCHEMA_STORE_NAME } from "../constants/schema-store.constant";
import { InvalidStoreNameException } from "../exceptions/InvalidStoreNameException";
import { areIdentical } from "../utils/is-equal.utils";
import * as i0 from "@angular/core";
import * as i1 from "./ngx-indexed-database-store-schema.service";
export class NgxIndexedDatabaseService {
constructor(_ngxIndexedDatabaseStoreSchemaService) {
this._ngxIndexedDatabaseStoreSchemaService = _ngxIndexedDatabaseStoreSchemaService;
}
static getInstance() {
if (!this._instance) {
this._instance = new NgxIndexedDatabaseService(new NgxIndexedDatabaseStoreSchemaService());
}
return this._instance;
}
createStore(dbName, storeName, storeSchema) {
var _a;
return __awaiter(this, void 0, void 0, function* () {
if (!dbName || !storeName) {
throw new InvalidArgumentsException();
}
if (storeName === SCHEMA_STORE_NAME) {
throw new InvalidStoreNameException();
}
const primaryKeys = HelperUtils.getIndexedDBStoreSchemaPrimaryKeys(storeSchema);
if (primaryKeys.length !== 1) {
throw new PrimaryKeysCountException();
}
yield this._ngxIndexedDatabaseStoreSchemaService.defineSchemasStore(dbName);
const alreadyExistingSchema = yield this._ngxIndexedDatabaseStoreSchemaService.getStoreSchema(dbName, storeName);
const ifSchemasIdentical = areIdentical(alreadyExistingSchema, storeSchema);
if (ifSchemasIdentical) {
return { success: true };
}
if (alreadyExistingSchema && !ifSchemasIdentical) {
yield this.deleteStore(dbName, storeName);
}
const version = (yield HelperUtils.getDatabaseVersion(dbName)) + 1;
const indexedDBOpenRequest = indexedDB.open(dbName, version);
yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onupgradeneeded');
const database = indexedDBOpenRequest.result;
const store = database.createObjectStore(storeName, { keyPath: primaryKeys[0] });
for (const attribute in storeSchema) {
if ([IndexedDBKeysDataType.STRING, IndexedDBKeysDataType.INTEGER].includes(storeSchema[attribute].datatype)) {
store.createIndex(attribute, attribute, { unique: ((_a = storeSchema[attribute]) === null || _a === void 0 ? void 0 : _a.unique) || false });
}
}
yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onsuccess', 'onerror');
database === null || database === void 0 ? void 0 : database.close();
yield this._ngxIndexedDatabaseStoreSchemaService.modifySchemaStore(dbName, storeName, storeSchema);
return { success: true };
});
}
deleteStore(dbName, storeName) {
return __awaiter(this, void 0, void 0, function* () {
if (!dbName || !storeName) {
throw new InvalidArgumentsException();
}
const version = (yield HelperUtils.getDatabaseVersion(dbName)) + 1;
const indexedDBOpenRequest = indexedDB.open(dbName, version);
yield HelperUtils.promisifyIndexedDBRequest(indexedDBOpenRequest, 'onupgradeneeded');
const database = indexedDBOpenRequest.result;
database.deleteObjectStore(storeName);
yield this._ngxIndexedDatabaseStoreSchemaService.removeStoreSchema(dbName, storeName);
database === null || database === void 0 ? void 0 : database.close();
return { success: true };
});
}
}
NgxIndexedDatabaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxIndexedDatabaseService, deps: [{ token: i1.NgxIndexedDatabaseStoreSchemaService }], target: i0.ɵɵFactoryTarget.Injectable });
NgxIndexedDatabaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxIndexedDatabaseService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: NgxIndexedDatabaseService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: i1.NgxIndexedDatabaseStoreSchemaService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWluZGV4ZWQtZGF0YWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbmRleGVkLWRhdGFiYXNlL3NyYy9saWIvbmd4LWluZGV4ZWQtZGF0YWJhc2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUNsRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDbEYsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDckUsT0FBTyxFQUFDLG9DQUFvQyxFQUFDLE1BQU0sNkNBQTZDLENBQUM7QUFDakcsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDbEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDOzs7QUFLckQsTUFBTSxPQUFPLHlCQUF5QjtJQUdwQyxZQUFvQixxQ0FBMkU7UUFBM0UsMENBQXFDLEdBQXJDLHFDQUFxQyxDQUFzQztJQUFJLENBQUM7SUFFN0YsTUFBTSxDQUFDLFdBQVc7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLHlCQUF5QixDQUFDLElBQUksb0NBQW9DLEVBQUUsQ0FBQyxDQUFDO1NBQzVGO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFWSxXQUFXLENBQUMsTUFBYyxFQUFFLFNBQWlCLEVBQUUsV0FBaUM7OztZQUMzRixJQUFJ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QUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFL0UsTUFBTSxXQUFXLENBQUMseUJBQXlCLENBQUMsb0JBQW9CLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNyRixNQUFNLFFBQVEsR0FBZ0Isb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQzFELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QyxNQUFNLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEYsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLEtBQUssRUFBRSxDQUFDO1lBRWxCLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDM0IsQ0FBQztLQUFBOzt1SEF2RVUseUJBQXlCOzJIQUF6Qix5QkFBeUIsY0FGeEIsTUFBTTs0RkFFUCx5QkFBeUI7a0JBSHJDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtJbmRleGVkREJTdG9yZVNjaGVtYX0gZnJvbSBcIi4uL21vZGVscy9JbmRleGVkREJTdG9yZVNjaGVtYVwiO1xuaW1wb3J0IHtJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9ufSBmcm9tIFwiLi4vZXhjZXB0aW9ucy9JbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uXCI7XG5pbXBvcnQge0hlbHBlclV0aWxzfSBmcm9tIFwiLi4vdXRpbHMvaGVscGVyLnV0aWxzXCI7XG5pbXBvcnQge1ByaW1hcnlLZXlzQ291bnRFeGNlcHRpb259IGZyb20gXCIuLi9leGNlcHRpb25zL1ByaW1hcnlLZXlzQ291bnRFeGNlcHRpb25cIjtcbmltcG9ydCB7SW5kZXhlZERCS2V5c0RhdGFUeXBlfSBmcm9tIFwiLi4vZW51bXMvSW5kZXhlZERCS2V5c0RhdGFUeXBlXCI7XG5pbXBvcnQge05neEluZGV4ZWREYXRhYmFzZVN0b3JlU2NoZW1hU2VydmljZX0gZnJvbSBcIi4vbmd4LWluZGV4ZWQtZGF0YWJhc2Utc3RvcmUtc2NoZW1hLnNlcnZpY2VcIjtcbmltcG9ydCB7U0NIRU1BX1NUT1JFX05BTUV9IGZyb20gXCIuLi9jb25zdGFudHMvc2NoZW1hLXN0b3JlLmNvbnN0YW50XCI7XG5pbXBvcnQge0ludmFsaWRTdG9yZU5hbWVFeGNlcHRpb259IGZyb20gXCIuLi9leGNlcHRpb25zL0ludmFsaWRTdG9yZU5hbWVFeGNlcHRpb25cIjtcbmltcG9ydCB7YXJlSWRlbnRpY2FsfSBmcm9tIFwiLi4vdXRpbHMvaXMtZXF1YWwudXRpbHNcIjtcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTmd4SW5kZXhlZERhdGFiYXNlU2VydmljZSB7XG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTmd4SW5kZXhlZERhdGFiYXNlU2VydmljZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZ3hJbmRleGVkRGF0YWJhc2VTdG9yZVNjaGVtYVNlcnZpY2U6IE5neEluZGV4ZWREYXRhYmFzZVN0b3JlU2NoZW1hU2VydmljZSkgeyB9XG5cbiAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBOZ3hJbmRleGVkRGF0YWJhc2VTZXJ2aWNlIHtcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9pbnN0YW5jZSA9IG5ldyBOZ3hJbmRleGVkRGF0YWJhc2VTZXJ2aWNlKG5ldyBOZ3hJbmRleGVkRGF0YWJhc2VTdG9yZVNjaGVtYVNlcnZpY2UoKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVTdG9yZShkYk5hbWU6IHN0cmluZywgc3RvcmVOYW1lOiBzdHJpbmcsIHN0b3JlU2NoZW1hOiBJbmRleGVkREJTdG9yZVNjaGVtYSk6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgICBpZiAoIWRiTmFtZSB8fCAhc3RvcmVOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50c0V4Y2VwdGlvbigpO1xuICAgIH1cbiAgICBpZiAoc3RvcmVOYW1lID09PSBTQ0hFTUFfU1RPUkVfTkFNRSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRTdG9yZU5hbWVFeGNlcHRpb24oKTtcbiAgICB9XG4gICAgY29uc3QgcHJpbWFyeUtleXMgPSBIZWxwZXJVdGlscy5nZXRJbmRleGVkREJTdG9yZVNjaGVtYVByaW1hcnlLZXlzKHN0b3JlU2NoZW1hKTtcbiAgICBpZiAocHJpbWFyeUtleXMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgUHJpbWFyeUtleXNDb3VudEV4Y2VwdGlvbigpO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuX25neEluZGV4ZWREYXRhYmFzZVN0b3JlU2NoZW1hU2VydmljZS5kZWZpbmVTY2hlbWFzU3RvcmUoZGJOYW1lKTtcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RpbmdTY2hlbWEgPSBhd2FpdCB0aGlzLl9uZ3hJbmRleGVkRGF0YWJhc2VTdG9yZVNjaGVtYVNlcnZpY2UuZ2V0U3RvcmVTY2hlbWEoZGJOYW1lLCBzdG9yZU5hbWUpO1xuICAgIGNvbnN0IGlmU2NoZW1hc0lkZW50aWNhbCA9IGFyZUlkZW50aWNhbChhbHJlYWR5RXhpc3RpbmdTY2hlbWEsIHN0b3JlU2NoZW1hKTtcblxuICAgIGlmIChpZlNjaGVtYXNJZGVudGljYWwpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICB9XG5cbiAgICBpZiAoYWxyZWFkeUV4aXN0aW5nU2NoZW1hICYmICFpZlNjaGVtYXNJZGVudGljYWwpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU3RvcmUoZGJOYW1lLCBzdG9yZU5hbWUpO1xuICAgIH1cblxuICAgIGNvbnN0IHZlcnNpb24gPSAoYXdhaXQgSGVscGVyVXRpbHMuZ2V0RGF0YWJhc2VWZXJzaW9uKGRiTmFtZSkpICsgMTtcbiAgICBjb25zdCBpbmRleGVkREJPcGVuUmVxdWVzdDogSURCT3BlbkRCUmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKGRiTmFtZSwgdmVyc2lvbik7XG5cbiAgICBhd2FpdCBIZWxwZXJVdGlscy5wcm9taXNpZnlJbmRleGVkREJSZXF1ZXN0KGluZGV4ZWREQk9wZW5SZXF1ZXN0LCAnb251cGdyYWRlbmVlZGVkJyk7XG4gICAgY29uc3QgZGF0YWJhc2U6IElEQkRhdGFiYXNlID0gaW5kZXhlZERCT3BlblJlcXVlc3QucmVzdWx0O1xuICAgIGNvbnN0IHN0b3JlOiBJREJPYmplY3RTdG9yZSA9IGRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKHN0b3JlTmFtZSwgeyBrZXlQYXRoOiBwcmltYXJ5S2V5c1swXSB9KTtcbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZSBpbiBzdG9yZVNjaGVtYSkge1xuICAgICAgaWYgKFtJbmRleGVkREJLZXlzRGF0YVR5cGUuU1RSSU5HLCBJbmRleGVkREJLZXlzRGF0YVR5cGUuSU5URUdFUl0uaW5jbHVkZXMoc3RvcmVTY2hlbWFbYXR0cmlidXRlXS5kYXRhdHlwZSkpIHtcbiAgICAgICAgc3RvcmUuY3JlYXRlSW5kZXgoYXR0cmlidXRlLCBhdHRyaWJ1dGUsIHsgdW5pcXVlOiBzdG9yZVNjaGVtYVthdHRyaWJ1dGVdPy51bmlxdWUgfHwgZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgSGVscGVyVXRpbHMucHJvbWlzaWZ5SW5kZXhlZERCUmVxdWVzdChpbmRleGVkREJPcGVuUmVxdWVzdCwgJ29uc3VjY2VzcycsICdvbmVycm9yJyk7XG4gICAgZGF0YWJhc2U/LmNsb3NlKCk7XG5cbiAgICBhd2FpdCB0aGlzLl9uZ3hJbmRleGVkRGF0YWJhc2VTdG9yZVNjaGVtYVNlcnZpY2UubW9kaWZ5U2NoZW1hU3RvcmUoZGJOYW1lLCBzdG9yZU5hbWUsIHN0b3JlU2NoZW1hKTtcblxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkZWxldGVTdG9yZShkYk5hbWU6IHN0cmluZywgc3RvcmVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbiB9PiAge1xuICAgIGlmICghZGJOYW1lIHx8ICFzdG9yZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRzRXhjZXB0aW9uKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmVyc2lvbiA9IChhd2FpdCBIZWxwZXJVdGlscy5nZXREYXRhYmFzZVZlcnNpb24oZGJOYW1lKSkgKyAxO1xuICAgIGNvbnN0IGluZGV4ZWREQk9wZW5SZXF1ZXN0OiBJREJPcGVuREJSZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oZGJOYW1lLCB2ZXJzaW9uKTtcblxuICAgIGF3YWl0IEhlbHBlclV0aWxzLnByb21pc2lmeUluZGV4ZWREQlJlcXVlc3QoaW5kZXhlZERCT3BlblJlcXVlc3QsICdvbnVwZ3JhZGVuZWVkZWQnKTtcbiAgICBjb25zdCBkYXRhYmFzZTogSURCRGF0YWJhc2UgPSBpbmRleGVkREJPcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgZGF0YWJhc2UuZGVsZXRlT2JqZWN0U3RvcmUoc3RvcmVOYW1lKTtcbiAgICBhd2FpdCB0aGlzLl9uZ3hJbmRleGVkRGF0YWJhc2VTdG9yZVNjaGVtYVNlcnZpY2UucmVtb3ZlU3RvcmVTY2hlbWEoZGJOYW1lLCBzdG9yZU5hbWUpO1xuICAgIGRhdGFiYXNlPy5jbG9zZSgpO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iXX0=