76 lines
2.5 KiB
JavaScript
76 lines
2.5 KiB
JavaScript
// 📦 IndexedDB Helper
|
|
function openDB() {
|
|
return new Promise((resolve, reject) => {
|
|
const request = indexedDB.open('directory-handle-db', 1);
|
|
request.onupgradeneeded = () => {
|
|
request.result.createObjectStore('handles');
|
|
};
|
|
request.onsuccess = () => resolve(request.result);
|
|
request.onerror = () => reject(request.error);
|
|
});
|
|
}
|
|
|
|
// 💾 Store a directory handle
|
|
async function storeDirectoryHandle(handle) {
|
|
const db = await openDB();
|
|
const tx = db.transaction('handles', 'readwrite');
|
|
tx.objectStore('handles').put(handle, 'my-folder');
|
|
await tx.done;
|
|
}
|
|
|
|
// 📂 Retrieve a directory handle
|
|
async function getDirectoryHandle() {
|
|
const db = await openDB();
|
|
const tx = db.transaction('handles', 'readonly');
|
|
return new Promise((resolve, reject) => {
|
|
const getRequest = tx.objectStore('handles').get('my-folder');
|
|
getRequest.onsuccess = () => resolve(getRequest.result);
|
|
getRequest.onerror = () => reject(getRequest.error);
|
|
});
|
|
}
|
|
|
|
// 🔐 Check or request permission
|
|
async function verifyPermission(handle, mode = 'readwrite') {
|
|
const opts = { mode };
|
|
if ((await handle.queryPermission(opts)) === 'granted') return true;
|
|
if ((await handle.requestPermission(opts)) === 'granted') return true;
|
|
return false;
|
|
}
|
|
|
|
// 🧠 List contents of a directory
|
|
async function listDirectoryContents(dirHandle) {
|
|
for await (const [name, handle] of dirHandle.entries()) {
|
|
console.log(`${handle.kind === 'file' ? '📄' : '📁'} ${name}`);
|
|
}
|
|
}
|
|
|
|
// 📌 Request persistent storage
|
|
async function ensurePersistentStorage() {
|
|
if (navigator.storage && navigator.storage.persist) {
|
|
const granted = await navigator.storage.persist();
|
|
console.log(granted
|
|
? '✅ Persistent storage granted.'
|
|
: '⚠️ Storage may be cleared under pressure.');
|
|
}
|
|
}
|
|
|
|
// 🚀 Main logic
|
|
export default async function initDirectoryAccess() {
|
|
await ensurePersistentStorage();
|
|
|
|
let handle = await getDirectoryHandle();
|
|
|
|
if (!handle || !(await verifyPermission(handle))) {
|
|
handle = await window.showDirectoryPicker();
|
|
if (await verifyPermission(handle)) {
|
|
await storeDirectoryHandle(handle);
|
|
} else {
|
|
console.warn('Permission denied for selected directory.');
|
|
return;
|
|
}
|
|
}
|
|
|
|
console.log('📂 Directory handle ready. Listing contents:');
|
|
await listDirectoryContents(handle);
|
|
}
|
|
|