File size: 3,205 Bytes
aa1ee73 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | // 存储文件句柄和配置信息
const DB_NAME = "FileHandleDB";
const HANDLE_STORE = "handles";
const CONFIG_STORE = "config";
const DB_VERSION = 2;
let db: IDBDatabase | null = null;
const initDB = (): Promise<void> => {
return new Promise((resolve, reject) => {
if (db) {
resolve();
return;
}
const request = indexedDB.open(DB_NAME, DB_VERSION);
request.onerror = () => reject(request.error);
request.onsuccess = () => {
db = request.result;
resolve();
};
request.onupgradeneeded = (event) => {
const db = (event.target as IDBOpenDBRequest).result;
if (!db.objectStoreNames.contains(HANDLE_STORE)) {
db.createObjectStore(HANDLE_STORE);
}
if (!db.objectStoreNames.contains(CONFIG_STORE)) {
db.createObjectStore(CONFIG_STORE);
}
};
});
};
export const storeFileHandle = async (
key: string,
handle: FileSystemHandle
): Promise<void> => {
await initDB();
if (!db) throw new Error("Database not initialized");
return new Promise((resolve, reject) => {
const transaction = db.transaction(HANDLE_STORE, "readwrite");
const store = transaction.objectStore(HANDLE_STORE);
const request = store.put(handle, key);
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve();
});
};
export const getFileHandle = async (
key: string
): Promise<FileSystemHandle | null> => {
await initDB();
if (!db) throw new Error("Database not initialized");
return new Promise((resolve, reject) => {
const transaction = db.transaction(HANDLE_STORE, "readonly");
const store = transaction.objectStore(HANDLE_STORE);
const request = store.get(key);
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve(request.result);
});
};
export const storeConfig = async (key: string, value: any): Promise<void> => {
await initDB();
if (!db) throw new Error("Database not initialized");
return new Promise((resolve, reject) => {
const transaction = db.transaction(CONFIG_STORE, "readwrite");
const store = transaction.objectStore(CONFIG_STORE);
const request = store.put(value, key);
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve();
});
};
export const getConfig = async (key: string): Promise<any> => {
await initDB();
if (!db) throw new Error("Database not initialized");
return new Promise((resolve, reject) => {
const transaction = db.transaction(CONFIG_STORE, "readonly");
const store = transaction.objectStore(CONFIG_STORE);
const request = store.get(key);
request.onerror = () => reject(request.error);
request.onsuccess = () => resolve(request.result);
});
};
export const verifyPermission = async (
handle: FileSystemHandle,
mode: FileSystemPermissionMode = "readwrite"
): Promise<boolean> => {
if (!handle) {
return false;
}
const options = { mode };
// 检查当前权限
if ((await handle.queryPermission(options)) === "granted") {
return true;
}
// 请求权限
if ((await handle.requestPermission(options)) === "granted") {
return true;
}
return false;
};
|