z-util-page
Version:
453 lines (452 loc) • 14.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.IDBHelper = void 0;
const tslib_1 = require("tslib");
/**
* @category indexedDB操作辅助类
*/
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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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 tslib_1.__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;
});
}
}
exports.IDBHelper = IDBHelper;