file started

This commit is contained in:
Seth Trowbridge 2025-07-07 22:48:20 -04:00
parent bf9d740c13
commit 975694f798
9 changed files with 134 additions and 1 deletions

43
app.js Normal file
View File

@ -0,0 +1,43 @@
import FSHandle from "./store.js";
const Rooms = {};
async function getFolderHandle() {
try {
const dirHandle = await globalThis.showDirectoryPicker();
console.log("Folder selected:", dirHandle);
for await (const [name, roomsHandle] of dirHandle.entries())
{
if(name == "room" && roomsHandle.kind == "directory")
{
for await (const [name, roomHandle] of roomsHandle.entries())
{
if(roomHandle.kind == "directory")
{
Rooms[name] = roomHandle;
}
}
}
}
console.log(Rooms);
} catch (err) {
console.error("Folder selection cancelled or failed:", err);
}
}
function Init()
{
const d =(...args)=> document.createElement(...args);
const button = d("button");
button.innerText = "open";
button.addEventListener("click", getFolderHandle);
document.body.appendChild(button)
}
Init();

View File

@ -1,5 +1,8 @@
{
"compilerOptions": {
"checkJs": true
"checkJs": true,
"lib":[
"deno.window", "dom"
]
}
}

11
index.html Normal file
View File

@ -0,0 +1,11 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="app.js" type="module">
</script>
</body>
</html>

View File

View File

View File

View File

View File

76
store.js Normal file
View File

@ -0,0 +1,76 @@
// 📦 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);
}