UNPKG

tsbase

Version:

Base class libraries for TypeScript

150 lines 5.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.IndexedDb = void 0; const Until_1 = require("../../Utility/Timers/Until"); const module_1 = require("../../Patterns/CommandQuery/module"); const TransactionModes_1 = require("./TransactionModes"); class IndexedDb { static Instance(name, version, migrations, indexedDbFactory = indexedDB) { return new IndexedDb(name, version, migrations, indexedDbFactory); } get Connected() { return !!this.database; } ; constructor(Name, Version, migrations, indexedDbFactory) { this.Name = Name; this.Version = Version; this.migrations = migrations; this.indexedDbFactory = indexedDbFactory; this.database = null; } async Connect() { return new module_1.AsyncQuery(async () => { if (this.Connected) { return this.database; } else { const openRequest = this.indexedDbFactory.open(this.Name, this.Version); this.setOpenRequestHandlers(openRequest, this.migrations); await (0, Until_1.Until)(() => this.Connected); return this.database; } }).Execute(); } Insert(insertions) { const storeNames = Object.keys(insertions); return this.executeTransaction(storeNames, (transaction) => { storeNames.forEach(storeName => { const store = transaction.objectStore(storeName); const objects = insertions[storeName]; objects.forEach(object => { store.add(object); }); }); }); } Get(storeName, query) { return new module_1.AsyncQuery(async () => { await this.Connect(); let complete = false; let result = null; const transaction = this.database.transaction([storeName], TransactionModes_1.TransactionMode.ReadOnly); const store = transaction.objectStore(storeName); if (typeof query === 'string' || typeof query === 'number') { const request = store.get(query); request.onsuccess = () => { result = request.result || null; complete = true; }; } else { store.openCursor().onsuccess = (event) => { result = result ? result : new Array(); const cursor = event.target.result; if (cursor && query(cursor['value'])) { result.push(cursor.value); cursor.continue(); } else if (cursor) { cursor.continue(); } else { complete = true; } }; } await (0, Until_1.Until)(() => complete); return result; }).Execute(); } GetAll(storeName) { return new module_1.AsyncQuery(async () => { await this.Connect(); let complete = false; let result = new Array(); const request = this.database.transaction([storeName], TransactionModes_1.TransactionMode.ReadOnly) .objectStore(storeName) .getAll(); request.onsuccess = (event) => { result = event.target.result; complete = true; }; await (0, Until_1.Until)(() => complete); return result; }).Execute(); } Delete(deletions) { const storeNames = Object.keys(deletions); return this.executeTransaction(storeNames, (transaction) => { storeNames.forEach(storeName => { const store = transaction.objectStore(storeName); const keys = deletions[storeName]; keys.forEach(key => { store.delete(key); }); }); }); } Update(updates) { const storeNames = Object.keys(updates); return this.executeTransaction(storeNames, (transaction) => { storeNames.forEach(storeName => { const store = transaction.objectStore(storeName); const objects = updates[storeName]; objects.forEach(object => { store.put(object); }); }); }); } Disconnect() { var _a; (_a = this.database) === null || _a === void 0 ? void 0 : _a.close(); this.database = null; } setOpenRequestHandlers(openRequest, migrations) { openRequest.onupgradeneeded = async (e) => { const db = openRequest.result; for (const migration of migrations) { if (e.oldVersion < migration.version && this.Version >= migration.version) { migration.command(db); } } }; openRequest.onsuccess = () => this.database = openRequest.result; } executeTransaction(storeNames, command) { return new module_1.AsyncCommand(async () => { await this.Connect(); let complete = false; const transaction = this.database.transaction(storeNames, TransactionModes_1.TransactionMode.ReadWrite); command(transaction); transaction.oncomplete = () => complete = true; await (0, Until_1.Until)(() => complete); }).Execute(); } } exports.IndexedDb = IndexedDb; //# sourceMappingURL=IndexedDb.js.map