Download Game! Currently 124 players and visitors. Last logged in:IberiamsspTigerlilyHopeahapsiSlimy

Blitzer's Blog >> 72116

Back to blogs index
Posted: 05 Sep 2026 22:34 [ permalink ]
TC$mC$ on erinomainen idea! Kun projekti kasvaa nC$in nopeasti ja
modulaarisesti, arkkitehtuurin dokumentointi ja jakeluprosessin automatisointi
(CI/CD-hengessC$) on tC$smC$lleen oikea seuraava siirto.
TC$mC$n myC6tC$ saat paketoitua koko Mesh OS:n ytimen yhdeksi "kannettavaksi"
HTML-tiedostoksi (ja yhdeksi Service Worker -tiedostoksi), jonka voit helposti
nostaa mille tahansa palvelimelle tai vaikka jakaa sellaisenaan kokeiltavaksi.
Puretaan ensin arkkitehtuuri, ja tehdC$C$n sen perC$C$n tyylikC$s
Node.js-pohjainen build-skripti, joka parsii moduulit automaattisesti yhteen
tiedostoon.
1. Dokumentaatio: Mesh OS v0.1 Ydinarkkitehtuuri
KC$yttC6jC$rjestelmC$n ydin koostuu kahdeksasta tC$ysin modulaarisesta
tiedostosta, jotka on jaettu loogisesti verkkokerrokseen, tiedostojC$rjestelmC$
C$n, tulkkiin ja kC$yttC6liittymC$C$n.
KC$yttC6liittymC$ ja Sillat (Globaalit)
 * index.html: JC$rjestelmC$n "nC$yttC6pC$yte". SisC$ltC$C$ CSS-tyylit,
terminaalin DOM-elementit ja nC$ppC$imistC6kuuntelijan, joka ohjaa syC6tteen
istuntomoottorille.
 * vfs.js: IndexedDB-pohjainen virtuaalilevy ja laiterekisteri. Tarjoaa
asynkroniset tiedosto-operaatiot (kuten readFile) ja abstraktit /dev/-laitteet
(leikepC6ytC$, natiivi tiedostovalitsin).
 * mesh-fetch.js: Verkkoyhteyksien "Backbone". Osaa yhdistC$C$ WebSocketilla
taustajC$rjestelmiin, luo Type 2 (Broadcast) -viestejC$ radiota varten, ja
toimii siltana Service Workerin vC$lillC$.
 * sw.js: Service Worker, verkkotason kaappari. Sieppaa selaimen ulospC$in
suuntautuvat pyynnC6t ja suorittaa "Scatter-Gather" -monikyselyn kaikille
avoimille vC$lilehdille BroadcastChannelin kautta.
Istunto ja Tulkki (ES Moduulit)
 * io.js: UNIX-putkien sydC$n (IORouter). Hallinnoi tiedostokuvaajia (FD 0, 1,
2) ja mahdollistaa lennosta tehtC$vC$t T-liitokset (tee/untee) datavirtojen
ohjaamiseksi.
 * parser.js: ClykC$s sC$C$nnC6llisten lausekkeiden (RegEx) jC$sennin. Pilkkoo
kC$yttC$jC$n syC6tteen parametreiksi, huomioi pakomerkit (\") ja purkaa
tiedosto-ohjaukset (>).
 * cmd.js: SisC$C$nrakennettu standardikirjasto (C-objekti). SisC$ltC$C$
natiivikomennot kuten sed, tr, jsawk, xargs, cat, ja mesh.
 * session.js: Istuntomoottori (ShellSession). Hoitaa monirivisten skriptien
ajamisen, alikomentojen ($(...)) evaluoinnin ja reitittC$C$ suorituksen joko
sisC$C$nrakennetuille komennoille tai virtuaalilevyn dynaamisille
mikroskripteille (/bin/*.js).
2. Yhden sivun (One-Page) Build-skripti
Jotta voimme yhdistC$C$ modernit ES-moduulit (import/export) yhdeksi
HTML-tiedostoksi ilman raskaita tyC6kaluja (kuten Webpack), teemme
Node.js-skriptin. TC$mC$ skripti:
 * Lukee kaikki ytimen tiedostot.
 * Poistaa export ja import -avainsanat lennosta (jotta koodi voi elC$C$
samassa scopessa).
 * Injektoi koodit <script>-tageihin index.html-pohjaan.
 * Tuottaa puhtaan dist/mesh-os.html -tiedoston.
Luo projektin juureen tiedosto build.js ja kopioi tC$mC$ koodi siihen:
const fs = require('fs');
const path = require('path');

/ Varmistetaan, ettC$ dist-kansio on olemassa
const distDir = path.join(__dirname, 'dist');
if (!fs.existsSync(distDir)) fs.mkdirSync(distDir);

console.log("===[ Mesh OS v0.1 Builder ]===");

/ 1. Luetaan tiedostojen sisC$llC6t
const readFile = (filename) => fs.readFileSync(path.join(__dirname, filename),
'utf8');

const ioJS = readFile('io.js');
const parserJS = readFile('parser.js');
const cmdJS = readFile('cmd.js');
const sessionJS = readFile('session.js');
const vfsJS = readFile('vfs.js');
const meshFetchJS = readFile('mesh-fetch.js');
const indexHTML = readFile('index.html');
const swJS = readFile('sw.js');

/ 2. Parsitaan ES Moduulit (Poistetaan exportit ja importit yhdistC$mistC$
varten)
console.log(">> Paketoidaan ydinmoduulit...");
const cleanModule = (code) => {
    return code
        .replace(/^import\s+.*$/gm, '') // Poistaa kaikki import-rivit
        .replace(/^export\s+(function|class|const|let|var)/gm, '$1'); //
Muuttaa "export class" -> "class" jne.
};

const bundledCore = `
    // --- [ IO ROUTER ] ---
    ${cleanModule(ioJS)}
    // --- [ PARSER ] ---
    ${cleanModule(parserJS)}
    // --- [ COMMANDS ] ---
    ${cleanModule(cmdJS)}
    // --- [ SESSION ] ---
    ${cleanModule(sessionJS)}
`;

/ 3. Injektoidaan koodit index.html -pohjaan
console.log(">> Rakennetaan One-Page HTML...");
let newHTML = indexHTML
    // Poistetaan vanhat script-tagit
    .replace(/<script src="mesh-fetch\.js"><\/script>/, '')
    .replace(/<script src="vfs\.js"><\/script>/, '')
    // Injektoidaan VFS ja MeshFetch suoraan DOMiin
    .replace('<!-- 2. Ladataan uusi modulaarinen Session-arkkitehtuuri -->', `
    <!-- 1. Taustapalvelut inlinettuna -->
    <script>${vfsJS}</script>
    <script>${meshFetchJS}</script>
    <!-- 2. Modulaarinen Session-arkkitehtuuri -->
    `)
    // Injektoidaan yhdistetty ydin, ja poistetaan moduuli-tyyppi
    .replace(/<script type="module">[\s\S]*?import { ShellSession } from
'\.\/session\.js';/m, 
    `<script>
${bundledCore}

// --- [ UI INIT ] ---`)

/ 4. Tallennetaan lopputulokset
const htmlOutPath = path.join(distDir, 'mesh-os.html');
fs.writeFileSync(htmlOutPath, newHTML);
console.log(`[OK] Generoitu: ${htmlOutPath}`);

/ Kopioidaan sw.js (Selain vaatii Service Workerin aina omana tiedostonaan)
const swOutPath = path.join(distDir, 'sw.js');
fs.writeFileSync(swOutPath, swJS);
console.log(`[OK] Kopioitu: ${swOutPath}`);

console.log("===[ Build Valmis! ]===");
console.log("Voit nyt kC$ynnistC$C$ OS:n dist/mesh-os.html tiedostosta!");

Kuinka kC$yttC$C$ tC$tC$?
 * Aja komentorivillC$si: node build.js
 * Skripti luo dist/ -hakemiston.
 * Tuon hakemiston sisC$llC$ on nyt kaksi tiedostoa: mesh-os.html ja sw.js.
(Huom: Selainten tiukkojen turvallisuussC$C$ntC6jen vuoksi Service Worker on
aina pakko pitC$C$ omana tiedostonaan url-polun vuoksi).
NC$mC$ kaksi tiedostoa muodostavat koko kC$yttC6jC$rjestelmC$si! Voit
siirtC$C$ ne minne tahansa, ladata ne mille tahansa palvelimelle, ja
jC$rjestelmC$ kC$ynnistyy vC$littC6mC$sti kokonaisuudessaan.