UNPKG

z-util-page

Version:
449 lines (448 loc) 14.5 kB
import { __awaiter } from "tslib"; /** * @category indexedDB操作辅助类 */ export class IDBHelper { /** * 构造函数 * @param name 数据库名称 * @throws Error 数据库名称不能为空 * @returns IDBHelper实例 * *** */ constructor(name) { Object.defineProperty(this, "dbRq", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "version", { enumerable: true, configurable: true, writable: true, value: 0 }); Object.defineProperty(this, "name", { enumerable: true, configurable: true, writable: true, value: void 0 }); Object.defineProperty(this, "upgradePromise", { enumerable: true, configurable: true, writable: true, value: Promise.resolve(true) }); Object.defineProperty(this, "resetPromise", { enumerable: true, configurable: true, writable: true, value: Promise.resolve(true) }); if (name === null || name === undefined) throw new Error("数据库名称不能为空"); this.name = name; this.createTable(['check']); } /** * 获取数据库版本号 */ getVersion() { return __awaiter(this, void 0, void 0, function* () { // 获取数据库版本号 const databases = yield indexedDB.databases(); const db = databases.find(item => item.name === this.name); db && (this.version = db.version || 0); return this.version; }); } /** * 检查连接状态 */ checkConnect() { return __awaiter(this, void 0, void 0, function* () { var _a; yield this.resetPromise; yield this.upgradePromise; if (this.dbRq) { try { this.dbRq.result.transaction(['check']).abort(); return Promise.resolve(true); } catch (error) { if (this.dbRq.readyState === "done") { (_a = this.dbRq.result) === null || _a === void 0 ? void 0 : _a.close(); this.dbRq = this.getDb(this.name); } return new Promise((resolve, reject) => { var _a; (_a = this.dbRq) === null || _a === void 0 ? void 0 : _a.addEventListener('success', () => { resolve(true); }); }); } } else { this.dbRq = this.getDb(this.name); return new Promise((resolve, reject) => { var _a; (_a = this.dbRq) === null || _a === void 0 ? void 0 : _a.addEventListener('success', () => { resolve(true); }); }); } }); } /** * 获取更新后的DB */ updateDb() { return __awaiter(this, void 0, void 0, function* () { yield this.resetPromise; yield this.getVersion(); const dbRq = this.dbRq = this.getDb(this.name, ++this.version); return dbRq; }); } /** * 获取DB */ getDb(name, version) { const dbRq = indexedDB.open(name, version); dbRq.addEventListener('success', () => { var _a; (_a = dbRq.result) === null || _a === void 0 ? void 0 : _a.addEventListener('versionchange', (e) => { var _a; (_a = dbRq.result) === null || _a === void 0 ? void 0 : _a.close(); if (e.newVersion && e.newVersion !== this.version) this.version = e.newVersion; }); }); return dbRq; } /** * 创建表 * @example * ```ts * const db = new IDBHelper('test'); * await db.createTable('tn'); * ``` * @param tableNameList 表名列表 * @param keyPath 主键 * @returns { Promise<boolean> } * *** */ createTable(tableNameList, keyPath) { return __awaiter(this, void 0, void 0, function* () { const { promise, resolve } = Promise.withResolvers(); this.upgradePromise = promise; const dbRq = yield this.updateDb(); dbRq.addEventListener('upgradeneeded', () => { if (typeof tableNameList === 'string') { tableNameList = [tableNameList]; } tableNameList.forEach(tableName => { const db = dbRq.result; if (db.objectStoreNames.contains(tableName)) return; db.createObjectStore(tableName, keyPath ? { keyPath } : { autoIncrement: true }); }); }); dbRq.addEventListener('success', () => { resolve(true); }); return promise; }); } /** * 删除表 * @example * ```ts * const db = new IDBHelper('test'); * await db.deleteTable('tn'); * ``` * @param tableNameList 表名列表 * @returns { Promise<boolean> } * *** */ deleteTable(tableNameList) { return __awaiter(this, void 0, void 0, function* () { const { promise, resolve } = Promise.withResolvers(); this.upgradePromise = promise; const dbRq = yield this.updateDb(); dbRq.addEventListener('upgradeneeded', () => { if (typeof tableNameList === 'string') { tableNameList = [tableNameList]; } tableNameList.forEach(tableName => { const db = dbRq.result; if (db.objectStoreNames.contains(tableName)) { db.deleteObjectStore(tableName); } }); }); dbRq.addEventListener('success', () => { resolve(true); }); return promise; }); } /** * 删除所有表 * @example * ```ts * const db = new IDBHelper('test'); * await db.deleteAllTable(); * ``` * @returns { Promise<boolean> } * *** */ deleteAllTable() { return __awaiter(this, void 0, void 0, function* () { const { promise, resolve } = Promise.withResolvers(); this.upgradePromise = promise; const dbRq = yield this.updateDb(); dbRq.addEventListener('upgradeneeded', () => { const db = dbRq.result; let tableNameList = Array.prototype.slice.call(db.objectStoreNames); tableNameList.forEach(tableName => { if (tableName === 'check') return; if (db.objectStoreNames.contains(tableName)) { db.deleteObjectStore(tableName); } }); }); dbRq.addEventListener('success', () => { resolve(true); }); return promise; }); } /** * 获取所有表名 * @example * ```ts * const db = new IDBHelper('test'); * await db.getAllTableName(); * ``` * @returns false 或 string[] * *** */ getAllTableName() { return __awaiter(this, void 0, void 0, function* () { var _a, _b; if (!this.dbRq) return false; yield this.checkConnect(); return (_b = (_a = this.dbRq) === null || _a === void 0 ? void 0 : _a.result) === null || _b === void 0 ? void 0 : _b.objectStoreNames; }); } /** * 增加/修改表中某行数据 * @example * ```ts * const db = new IDBHelper('test'); * await db.setTableRow('tn', '你好!'); * ``` * @param tableName 表名 * @param data 数据 * @returns { Promise<boolean> } * *** */ setTableRow(tableName, data) { return __awaiter(this, void 0, void 0, function* () { if (!this.dbRq) return false; yield this.checkConnect(); const tx = this.dbRq.result.transaction(tableName, "readwrite"); const request = tx.objectStore(tableName).put(data); request.onsuccess = () => { tx.commit(); }; request.onerror = () => { console.error("setTableRow failed"); }; }); } /** * 获取表中某行数据 * @example * ```ts * const db = new IDBHelper('test'); * await db.getTableRow('tn', 'key'); * ``` * @param tableName 表名 * @param key 键 * @returns { Promise<boolean> } * *** */ getTableRow(tableName, key) { return __awaiter(this, void 0, void 0, function* () { if (!this.dbRq) return false; yield this.checkConnect(); const tx = this.dbRq.result.transaction(tableName, "readwrite"); const request = tx.objectStore(tableName).get(key); return new Promise(resolve => { request.onsuccess = () => { resolve(request.result); tx.commit(); }; request.onerror = () => { console.error("getTableRow failed"); }; }); }); } /** * 删除表中某行数据 * @example * ```ts * const db = new IDBHelper('test'); * await db.deleteTableRow('tn', 'key'); * ``` * @param tableName 表名 * @param key 键 * @returns { Promise<boolean> } * *** */ deleteTableRow(tableName, key) { return __awaiter(this, void 0, void 0, function* () { if (!this.dbRq) return false; yield this.checkConnect(); const tx = this.dbRq.result.transaction(tableName, "readwrite"); const request = tx.objectStore(tableName).delete(key); request.onsuccess = () => { tx.commit(); }; request.onerror = () => { console.error("deleteTableRow failed"); }; }); } /** * 获取表中所有数据 * @example * ```ts * const db = new IDBHelper('test'); * await db.getAllTableRow('tn'); * ``` * @param tableName 表名 * @param range [范围](https://developer.mozilla.org/zh-CN/docs/Web/API/IDBKeyRange) * @returns { Promise<any[]> } * *** */ getAllTableRow(tableName, range) { return __awaiter(this, void 0, void 0, function* () { if (!this.dbRq) return false; yield this.checkConnect(); const tx = this.dbRq.result.transaction(tableName, "readwrite"); const request = tx.objectStore(tableName).getAll(range); return new Promise(resolve => { request.onsuccess = () => { resolve(request.result); tx.commit(); }; request.onerror = () => { console.error("getAllTableRow failed"); }; }); }); } /** * 获取表数据条数 * @example * ```ts * const db = new IDBHelper('test'); * await db.getTableRowCount('tn'); * ``` * @param tableName 表名 * @param range [范围](https://developer.mozilla.org/zh-CN/docs/Web/API/IDBKeyRange) * @returns { Promise<number> } * *** */ getTableRowCount(tableName, range) { return __awaiter(this, void 0, void 0, function* () { if (!this.dbRq) return false; yield this.checkConnect(); const tx = this.dbRq.result.transaction(tableName, "readwrite"); const request = tx.objectStore(tableName).count(range); return new Promise(resolve => { request.onsuccess = () => { resolve(request.result); tx.commit(); }; request.onerror = () => { console.error("getTableRowCount failed"); }; }); }); } /** * 关闭数据库 * @example * ```ts * const db = new IDBHelper('test'); * await db.close(); * ``` * @returns { Promise<boolean> } * *** */ close() { return __awaiter(this, void 0, void 0, function* () { if (!this.dbRq) return false; yield this.upgradePromise; yield this.resetPromise; const dbRq = this.dbRq; this.dbRq = undefined; if (dbRq.readyState === "done") { dbRq.result.close(); } else { dbRq.addEventListener('success', () => { dbRq.result.close(); }); } }); } /** * 重置数据库 * @example * ```ts * const db = new IDBHelper('test'); * await db.reSet(); * ``` * @returns { Promise<boolean> } * *** */ reSet() { return __awaiter(this, void 0, void 0, function* () { var _a; if (!this.dbRq) return false; try { (_a = this.dbRq.result) === null || _a === void 0 ? void 0 : _a.close(); } catch (error) { console.log(error); } const close = indexedDB.deleteDatabase(this.name); this.resetPromise = new Promise((resolve, reject) => { close.addEventListener("success", () => { this.version = 1; this.dbRq = this.getDb(this.name, this.version); // 创建数据库 this.createTable(['check']); resolve(true); }); }); return this.resetPromise; }); } }