service working server spoof
This commit is contained in:
parent
17ed928935
commit
4ac3f73fd8
54
app.js
54
app.js
@ -1,11 +1,9 @@
|
|||||||
import FSHandle from "./store.js";
|
import * as FSHandle from "./store-directory-handle.js";
|
||||||
|
|
||||||
|
|
||||||
const Rooms = {};
|
const Rooms = {};
|
||||||
|
async function getFolderHandle(dirHandle) {
|
||||||
async function getFolderHandle() {
|
|
||||||
try {
|
try {
|
||||||
const dirHandle = await globalThis.showDirectoryPicker();
|
|
||||||
|
|
||||||
const roomsFolder = await dirHandle.getDirectoryHandle("room");
|
const roomsFolder = await dirHandle.getDirectoryHandle("room");
|
||||||
if(roomsFolder)
|
if(roomsFolder)
|
||||||
@ -14,18 +12,18 @@ async function getFolderHandle() {
|
|||||||
{
|
{
|
||||||
if(roomFolder.kind == "directory")
|
if(roomFolder.kind == "directory")
|
||||||
{
|
{
|
||||||
const roomMetaFile = await roomFolder.getFileHandle("_room_meta.json");
|
const roomMetaFile = await roomFolder.getFileHandle("room.js");
|
||||||
if(roomMetaFile)
|
if(roomMetaFile)
|
||||||
{
|
{
|
||||||
let metaData = {};
|
let metaData = {};
|
||||||
try
|
//try
|
||||||
{
|
//{
|
||||||
metaData = await roomMetaFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t));
|
// metaData = await roomMetaFile.getFile().then(d=>d.text()).then(t=>JSON.parse(t));
|
||||||
}
|
//}
|
||||||
catch (e)
|
//catch (e)
|
||||||
{
|
//{
|
||||||
console.warn(`Couldn't parse room meta: ${roomFolder.name} / ${roomMetaFile.name}`, e);
|
// console.warn(`Couldn't parse room meta: ${roomFolder.name} / ${roomMetaFile.name}`, e);
|
||||||
}
|
//}
|
||||||
|
|
||||||
const roomObj =
|
const roomObj =
|
||||||
{
|
{
|
||||||
@ -106,26 +104,32 @@ async function getFolderHandle() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log("Rooms:", Rooms);
|
console.log("Rooms:", Rooms);
|
||||||
|
|
||||||
globalThis.Rooms = Rooms;
|
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Folder selection cancelled or failed:", err);
|
console.error("Folder selection cancelled or failed:", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const d =(...args)=> document.createElement(...args);
|
||||||
|
|
||||||
function Init()
|
let handle = false;
|
||||||
|
handle = await FSHandle.getDirectoryHandle();
|
||||||
|
if(handle)
|
||||||
{
|
{
|
||||||
const d =(...args)=> document.createElement(...args);
|
await getFolderHandle(handle);
|
||||||
|
|
||||||
const button = d("button");
|
|
||||||
button.innerText = "open";
|
|
||||||
button.addEventListener("click", getFolderHandle);
|
|
||||||
|
|
||||||
document.body.appendChild(button)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Init();
|
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);
|
||||||
@ -8,9 +8,9 @@
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
if ('serviceWorker' in navigator) {
|
if ('serviceWorker' in navigator) {
|
||||||
navigator.serviceWorker.register('/service-worker.js')
|
navigator.serviceWorker.register('/service-worker.js', {type:"module"})
|
||||||
.then(reg => console.log('Service Worker registered:', reg))
|
.then(reg => console.log('Service Worker registered:', reg))
|
||||||
.catch(err => console.error('Service Worker registration failed:', err));
|
.catch(err => console.error('Service Worker registration failed:', err));
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
35
index.js
35
index.js
@ -1,35 +0,0 @@
|
|||||||
import Graph from "./graph.js";
|
|
||||||
import User from "./data/users.js"
|
|
||||||
|
|
||||||
Graph({
|
|
||||||
user:User,
|
|
||||||
role:
|
|
||||||
{
|
|
||||||
dev:["Development", "u1"]
|
|
||||||
},
|
|
||||||
part:
|
|
||||||
{
|
|
||||||
p1:"hey",
|
|
||||||
p2:"sup"
|
|
||||||
},
|
|
||||||
desk:
|
|
||||||
{
|
|
||||||
d1:["Desk 01", ["dev"], "all", {p2:3}, "p1"]
|
|
||||||
},
|
|
||||||
pass:
|
|
||||||
{
|
|
||||||
pass1:
|
|
||||||
[
|
|
||||||
"Pass One",
|
|
||||||
{
|
|
||||||
u2:
|
|
||||||
{
|
|
||||||
p1:[
|
|
||||||
[123, "some data"],
|
|
||||||
[456, "more data"]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@ -1 +0,0 @@
|
|||||||
{"name":"a room!"}
|
|
||||||
@ -1,31 +1,55 @@
|
|||||||
self.addEventListener('install', (event) => {
|
import * as FSAccess from "./store-directory-handle.js";
|
||||||
console.log('[Service Worker] Installed');
|
|
||||||
self.skipWaiting(); // Activate worker immediately
|
|
||||||
});
|
|
||||||
|
|
||||||
self.addEventListener('activate', (event) => {
|
self.addEventListener('install', ()=> self.skipWaiting()); // Activate worker immediately);
|
||||||
console.log('[Service Worker] Activated');
|
self.addEventListener('activate', ()=> self.clients.claim()); // Become available to all pages);
|
||||||
return self.clients.claim(); // Become available to all pages
|
self.addEventListener('fetch', (event) =>event.respondWith(Interceptor(event)));
|
||||||
});
|
|
||||||
|
|
||||||
self.addEventListener('fetch', (event) => {
|
let handle = false;
|
||||||
|
async function Interceptor(event)
|
||||||
|
{
|
||||||
const url = new URL(event.request.url);
|
const url = new URL(event.request.url);
|
||||||
|
const pathname = url.pathname.substring(1)
|
||||||
|
const extension = pathname.substring(pathname.lastIndexOf('.') + 1);
|
||||||
|
|
||||||
// Intercept only JavaScript files
|
// Intercept only JavaScript files
|
||||||
if (url.pathname.endsWith('/room.js')) {
|
if ( extension == "js" || extension == "json" )
|
||||||
|
{
|
||||||
console.log('[Service Worker] Intercepted JS request:', url.href);
|
console.log('[Service Worker] Intercepted JS request:', url.href);
|
||||||
|
if(!handle)
|
||||||
console.log(globalThis.Rooms);
|
{
|
||||||
|
handle = await FSAccess.getDirectoryHandle();
|
||||||
// You can modify this to return a custom response if needed
|
}
|
||||||
event.respondWith(fetch(event.request));
|
if(handle)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
const parts = pathname.split("/");
|
||||||
|
let filePointer = handle;
|
||||||
|
for(let i=0; i<parts.length-1; i++)
|
||||||
|
{
|
||||||
|
filePointer = await filePointer.getDirectoryHandle(parts[i], {create: false});
|
||||||
|
}
|
||||||
|
console.log("about to get file handle", filePointer);
|
||||||
|
filePointer = await filePointer.getFileHandle(parts[parts.length-1], {create: false});
|
||||||
|
const file = await filePointer.getFile();
|
||||||
|
const content = await file.text();
|
||||||
|
console.log("responding to", pathname, "with content:", content);
|
||||||
|
return new Response(content, {
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/javascript',
|
||||||
|
'Cache-Control': 'no-cache'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch(e)
|
||||||
|
{
|
||||||
|
return fetch(event.request);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
self.addEventListener('message', (event) => {
|
|
||||||
console.log('Received message in Service Worker:', event.data);
|
|
||||||
|
|
||||||
// You can respond or act based on the message
|
|
||||||
});
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return fetch(event.request);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
52
store-directory-handle.js
Normal file
52
store-directory-handle.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
// 📦 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
|
||||||
|
export async function setDirectoryHandle(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
|
||||||
|
export 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 = () => {
|
||||||
|
console.error('Error retrieving directory handle:', getRequest.error);
|
||||||
|
return resolve(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 🔐 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 📌 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.');
|
||||||
|
}
|
||||||
|
}
|
||||||
76
store.js
76
store.js
@ -1,76 +0,0 @@
|
|||||||
// 📦 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user