vfsjs-test 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.html +8 -54
- package/main.js +67 -0
- package/package.json +1 -1
- package/sw.js +34 -10
package/index.html
CHANGED
|
@@ -2,66 +2,20 @@
|
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
|
-
<
|
|
6
|
-
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>Infrared Engine Workspace</title>
|
|
7
|
+
|
|
7
8
|
<link rel="stylesheet" href="live-theme.css">
|
|
8
9
|
</head>
|
|
9
10
|
<body style="background: #0f172a; color: #38bdf8; font-family: monospace; padding: 20px;">
|
|
10
11
|
|
|
11
|
-
<h2>Infrared
|
|
12
|
-
<div id="status" style="background: #020617; border: 1px solid #334155; padding: 15px; height:
|
|
13
|
-
>
|
|
12
|
+
<h2>Infrared VFS Operating Matrix</h2>
|
|
13
|
+
<div id="status" style="background: #020617; border: 1px solid #334155; padding: 15px; height: 180px; color: #f1f5f9; line-height: 1.6; overflow-y: auto;">
|
|
14
|
+
> Connecting decoupled operational layer...
|
|
14
15
|
</div>
|
|
15
16
|
|
|
16
|
-
<script src="
|
|
17
|
-
|
|
18
|
-
<script>
|
|
19
|
-
async function bootEngine() {
|
|
20
|
-
const display = document.getElementById('status');
|
|
21
|
-
|
|
22
|
-
try {
|
|
23
|
-
// Since index.html and sw.js live in the same repo, we can use a relative path!
|
|
24
|
-
// This completely bypasses the Same-Origin Policy check in Firefox.
|
|
25
|
-
const registration = await navigator.serviceWorker.register('./sw.js', { scope: './' });
|
|
26
|
-
display.innerHTML += "<br>> Service worker registered successfully.";
|
|
27
|
-
|
|
28
|
-
// Wait until the Service Worker has complete control of the page
|
|
29
|
-
if (!navigator.serviceWorker.controller) {
|
|
30
|
-
display.innerHTML += "<br>> Activating worker routing link... (Please refresh if stuck)";
|
|
31
|
-
await new Promise(r => navigator.serviceWorker.addEventListener('controllerchange', r, { once: true }));
|
|
32
|
-
}
|
|
33
|
-
display.innerHTML += "<br>> Link secured. Writing virtual assets to thread...";
|
|
34
|
-
|
|
35
|
-
// 3. Write your assets directly into the active worker's virtual RAM
|
|
36
|
-
const encoder = new TextEncoder();
|
|
37
|
-
|
|
38
|
-
navigator.serviceWorker.controller.postMessage({
|
|
39
|
-
type: 'VFS_WRITE',
|
|
40
|
-
filename: 'live-theme.css',
|
|
41
|
-
content: encoder.encode(`body { background: #011627 !important; color: #82aaff !important; }`)
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
navigator.serviceWorker.controller.postMessage({
|
|
45
|
-
type: 'VFS_WRITE',
|
|
46
|
-
filename: 'live-alert.js',
|
|
47
|
-
content: encoder.encode(`
|
|
48
|
-
console.log("SUCCESS: Native script tag caught by Service Worker intercept loop!");
|
|
49
|
-
document.getElementById('status').innerHTML += "<br>> Virtual script execution confirmed.";
|
|
50
|
-
`)
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
// Give the worker a tiny fraction of a second to map the files
|
|
54
|
-
await new Promise(r => setTimeout(r, 100));
|
|
55
|
-
|
|
56
|
-
display.innerHTML += "<br>> Matrix deployment complete.";
|
|
57
|
-
|
|
58
|
-
} catch (err) {
|
|
59
|
-
display.innerHTML += `<br>><span style="color: #ef4444;"> Error: ${err.message}</span>`;
|
|
60
|
-
console.error(err);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
17
|
+
<script src="index.js"></script>
|
|
63
18
|
|
|
64
|
-
|
|
65
|
-
</script>
|
|
19
|
+
<script src="main.js"></script>
|
|
66
20
|
</body>
|
|
67
21
|
</html>
|
package/main.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// main.js - Decoupled Controller and Client API
|
|
2
|
+
const display = document.getElementById('status');
|
|
3
|
+
|
|
4
|
+
window.vfs = {
|
|
5
|
+
encoder: new TextEncoder(),
|
|
6
|
+
|
|
7
|
+
add(filename, contentString, customMime = null) {
|
|
8
|
+
if (!navigator.serviceWorker.controller) return false;
|
|
9
|
+
|
|
10
|
+
navigator.serviceWorker.controller.postMessage({
|
|
11
|
+
type: 'VFS_WRITE',
|
|
12
|
+
filename: filename,
|
|
13
|
+
content: this.encoder.encode(contentString),
|
|
14
|
+
mime: customMime
|
|
15
|
+
});
|
|
16
|
+
display.innerHTML += `<br>> VFS Added: <b>${filename}</b> ${customMime ? `[${customMime}]` : ''}`;
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
delete(filename) {
|
|
20
|
+
if (!navigator.serviceWorker.controller) return false;
|
|
21
|
+
navigator.serviceWorker.controller.postMessage({
|
|
22
|
+
type: 'VFS_DELETE',
|
|
23
|
+
filename: filename
|
|
24
|
+
});
|
|
25
|
+
display.innerHTML += `<br>> VFS Deleted: <span style="color: #ef4444;">${filename}</span>`;
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
clear() {
|
|
29
|
+
if (!navigator.serviceWorker.controller) return false;
|
|
30
|
+
navigator.serviceWorker.controller.postMessage({ type: 'VFS_CLEAR' });
|
|
31
|
+
display.innerHTML += `<br>><span style="color: #f59e0b;"> VFS Memory Completely Wiped.</span>`;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
async function bootEngine() {
|
|
36
|
+
try {
|
|
37
|
+
const registration = await navigator.serviceWorker.register('./sw.js', { scope: './' });
|
|
38
|
+
display.innerHTML += "<br>> Service worker registered successfully.";
|
|
39
|
+
|
|
40
|
+
if (!navigator.serviceWorker.controller) {
|
|
41
|
+
display.innerHTML += "<br>> Activating worker routing link... (Please refresh)";
|
|
42
|
+
await new Promise(r => navigator.serviceWorker.addEventListener('controllerchange', r, { once: true }));
|
|
43
|
+
}
|
|
44
|
+
display.innerHTML += "<br>> Link secured. Executing transaction assertions...";
|
|
45
|
+
|
|
46
|
+
// Run Verification Loop
|
|
47
|
+
vfs.add('live-theme.css', `body { background: #070a13 !important; color: #22d3ee !important; }`);
|
|
48
|
+
|
|
49
|
+
vfs.add('index.js', `
|
|
50
|
+
console.log("VFS Execute: Active out of virtual memory pipeline!");
|
|
51
|
+
document.getElementById('status').innerHTML += "<br>> Virtual index.js routing validated.";
|
|
52
|
+
`, 'text/javascript');
|
|
53
|
+
|
|
54
|
+
// Verify Delete Works
|
|
55
|
+
vfs.add('trash.js', 'console.log("drop")');
|
|
56
|
+
vfs.delete('trash.js');
|
|
57
|
+
|
|
58
|
+
await new Promise(r => setTimeout(r, 100));
|
|
59
|
+
display.innerHTML += "<br>> Matrix deployment complete.";
|
|
60
|
+
|
|
61
|
+
} catch (err) {
|
|
62
|
+
display.innerHTML += `<br>><span style="color: #ef4444;"> Error: ${err.message}</span>`;
|
|
63
|
+
console.error(err);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
bootEngine();
|
package/package.json
CHANGED
package/sw.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
// sw.js - Virtual Storage Matrix Kernel
|
|
2
|
+
const vfsStorage = new Map();
|
|
1
3
|
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
+
const defaultMimes = {
|
|
5
|
+
'js': 'text/javascript',
|
|
6
|
+
'css': 'text/css',
|
|
7
|
+
'html': 'text/html',
|
|
8
|
+
'json': 'application/json'
|
|
9
|
+
};
|
|
4
10
|
|
|
5
11
|
self.addEventListener('install', e => e.waitUntil(self.skipWaiting()));
|
|
6
12
|
self.addEventListener('activate', e => e.waitUntil(self.clients.claim()));
|
|
@@ -9,20 +15,38 @@ self.addEventListener('fetch', (event) => {
|
|
|
9
15
|
const url = new URL(event.request.url);
|
|
10
16
|
const filename = url.pathname.split('/').pop().split('?')[0];
|
|
11
17
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const content = files.get(filename);
|
|
18
|
+
if (vfsStorage.has(filename)) {
|
|
19
|
+
const fileData = vfsStorage.get(filename);
|
|
15
20
|
const ext = filename.split('.').pop().toLowerCase();
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
const contentType = fileData.mime || defaultMimes[ext] || 'application/octet-stream';
|
|
22
|
+
|
|
23
|
+
event.respondWith(new Response(fileData.content, {
|
|
18
24
|
status: 200,
|
|
19
|
-
headers: {
|
|
25
|
+
headers: {
|
|
26
|
+
'Content-Type': contentType,
|
|
27
|
+
'Access-Control-Allow-Origin': '*'
|
|
28
|
+
}
|
|
20
29
|
}));
|
|
21
30
|
}
|
|
22
31
|
});
|
|
23
32
|
|
|
24
33
|
self.addEventListener('message', (event) => {
|
|
25
|
-
if (event.data
|
|
26
|
-
|
|
34
|
+
if (!event.data || !event.data.type) return;
|
|
35
|
+
|
|
36
|
+
switch (event.data.type) {
|
|
37
|
+
case 'VFS_WRITE':
|
|
38
|
+
vfsStorage.set(event.data.filename, {
|
|
39
|
+
content: event.data.content,
|
|
40
|
+
mime: event.data.mime || null
|
|
41
|
+
});
|
|
42
|
+
break;
|
|
43
|
+
|
|
44
|
+
case 'VFS_DELETE':
|
|
45
|
+
vfsStorage.delete(event.data.filename);
|
|
46
|
+
break;
|
|
47
|
+
|
|
48
|
+
case 'VFS_CLEAR':
|
|
49
|
+
vfsStorage.clear();
|
|
50
|
+
break;
|
|
27
51
|
}
|
|
28
52
|
});
|