135 lines
4.1 KiB
JavaScript
135 lines
4.1 KiB
JavaScript
import * as FSHandle from "./store-directory-handle.js";
|
|
|
|
|
|
const Rooms = {};
|
|
async function getFolderHandle(dirHandle) {
|
|
try {
|
|
|
|
const roomsFolder = await dirHandle.getDirectoryHandle("room");
|
|
if(roomsFolder)
|
|
{
|
|
for await (const [_, roomFolder] of roomsFolder.entries())
|
|
{
|
|
if(roomFolder.kind == "directory")
|
|
{
|
|
const roomMetaFile = await roomFolder.getFileHandle("room.js");
|
|
if(roomMetaFile)
|
|
{
|
|
let metaData = {};
|
|
//try
|
|
//{
|
|
// metaData = await roomMetaFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t));
|
|
//}
|
|
//catch (e)
|
|
//{
|
|
// console.warn(`Couldn't parse room meta: ${roomFolder.name} / ${roomMetaFile.name}`, e);
|
|
//}
|
|
|
|
const roomObj =
|
|
{
|
|
meta: metaData,
|
|
pass: {},
|
|
live: false,
|
|
async load()
|
|
{
|
|
if(this.live) return;
|
|
for await (const [_, passFolder] of roomFolder.entries())
|
|
{
|
|
if(passFolder.kind == "directory")
|
|
{
|
|
const passMeta = await passFolder.getFileHandle("_pass_meta.json");
|
|
if(passMeta)
|
|
{
|
|
|
|
let metaData = {};
|
|
try
|
|
{
|
|
metaData = await passMeta.getFile().then(d=>d.text()).then(t=>JSON.parse(t));
|
|
}
|
|
catch (e)
|
|
{
|
|
console.warn(`Couldn't parse pass meta: ${roomFolder.name} / ${passFolder.name} / ${passMeta.name}`, e);
|
|
}
|
|
|
|
const passObj = [
|
|
metaData,
|
|
{}
|
|
]
|
|
roomObj.pass[passFolder.name] = passObj;
|
|
|
|
for await (const [_, userFile] of passFolder.entries())
|
|
{
|
|
if(userFile.name.endsWith(".json") && userFile.name != "_pass_meta.json")
|
|
{
|
|
const userID = userFile.name.substring(0, userFile.name.length-5)
|
|
try
|
|
{
|
|
passObj[1][userID] = await userFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t));
|
|
}
|
|
catch (e)
|
|
{
|
|
console.warn(`Couldn't parse user data: ${roomFolder.name} / ${passFolder.name} / ${userFile.name}`, e);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
this.live = true;
|
|
|
|
globalThis.Pass = this.pass;
|
|
|
|
if (navigator.serviceWorker.controller)
|
|
{
|
|
navigator.serviceWorker.controller.postMessage(this.pass);
|
|
}
|
|
|
|
|
|
//await import(`./room/${roomFolder.name}/room.js`);
|
|
|
|
},
|
|
async dump()
|
|
{
|
|
this.live = false;
|
|
this.pass = {};
|
|
}
|
|
};
|
|
|
|
Rooms[roomFolder.name] = roomObj;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
console.log("Rooms:", Rooms);
|
|
|
|
} catch (err) {
|
|
console.error("Folder selection cancelled or failed:", err);
|
|
}
|
|
}
|
|
|
|
const d =(...args)=> document.createElement(...args);
|
|
|
|
let handle = false;
|
|
handle = await FSHandle.getDirectoryHandle();
|
|
if(handle)
|
|
{
|
|
await getFolderHandle(handle);
|
|
}
|
|
|
|
const button = d("button");
|
|
button.innerText = handle ? "change directory" : "select directory";
|
|
button.addEventListener("click", async()=>{
|
|
const directory = await globalThis.showDirectoryPicker();
|
|
await FSHandle.setDirectoryHandle(directory);
|
|
await getFolderHandle(directory);
|
|
console.log("about to spoof user filesystem as remote...");
|
|
const module = await import("./room/room_01/room.js");
|
|
console.log("module loaded", module);
|
|
button.innerText = "change directory"
|
|
});
|
|
|
|
document.body.appendChild(button); |