From 975694f7980ca8d3db4d2f22a059d1cb5147e31c Mon Sep 17 00:00:00 2001 From: Seth Trowbridge Date: Mon, 7 Jul 2025 22:48:20 -0400 Subject: [PATCH] file started --- app.js | 43 ++++++++++++++++ deno.json | 5 +- index.html | 11 ++++ room/room_01/_room_meta.json | 0 room/room_01/pass_01/_pass_meta.json | 0 room/room_01/pass_01/u1.json | 0 room/room_01/pass_01/u2.json | 0 room/room_01/pass_01/u3.json | 0 store.js | 76 ++++++++++++++++++++++++++++ 9 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 app.js create mode 100644 index.html create mode 100644 room/room_01/_room_meta.json create mode 100644 room/room_01/pass_01/_pass_meta.json create mode 100644 room/room_01/pass_01/u1.json create mode 100644 room/room_01/pass_01/u2.json create mode 100644 room/room_01/pass_01/u3.json create mode 100644 store.js diff --git a/app.js b/app.js new file mode 100644 index 0000000..d233686 --- /dev/null +++ b/app.js @@ -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(); \ No newline at end of file diff --git a/deno.json b/deno.json index 52d32e3..8d15f5d 100644 --- a/deno.json +++ b/deno.json @@ -1,5 +1,8 @@ { "compilerOptions": { - "checkJs": true + "checkJs": true, + "lib":[ + "deno.window", "dom" + ] } } \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..f45ead3 --- /dev/null +++ b/index.html @@ -0,0 +1,11 @@ + + + + + Document + + + + + \ No newline at end of file diff --git a/room/room_01/_room_meta.json b/room/room_01/_room_meta.json new file mode 100644 index 0000000..e69de29 diff --git a/room/room_01/pass_01/_pass_meta.json b/room/room_01/pass_01/_pass_meta.json new file mode 100644 index 0000000..e69de29 diff --git a/room/room_01/pass_01/u1.json b/room/room_01/pass_01/u1.json new file mode 100644 index 0000000..e69de29 diff --git a/room/room_01/pass_01/u2.json b/room/room_01/pass_01/u2.json new file mode 100644 index 0000000..e69de29 diff --git a/room/room_01/pass_01/u3.json b/room/room_01/pass_01/u3.json new file mode 100644 index 0000000..e69de29 diff --git a/store.js b/store.js new file mode 100644 index 0000000..bf62a10 --- /dev/null +++ b/store.js @@ -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); + } + \ No newline at end of file