TC$mC$ on erinomainen kysymys! Nyt kun Mesh OS on paketoitu siistiksi
kokonaisuudeksi, sen integroiminen osaksi muita web-sovelluksia tai
ulkopuolisia JS-rutiineita on elintC$rkeC$C$.
Mesh OS suunniteltiin alusta asti rajapinnoiltaan avoimeksi. Koska kyseessC$
on puhtaasti selaimessa pyC6rivC$ JS-moottori, virtuaalilevy ja komentotulkki
voidaan altistaa muulle selaimen koodille muutamalla yksinkertaisella
"koukulla".
TC$ssC$ on tC$ydellinen dokumentaatio ja ohjeet siihen, miten ohjaat Mesh
OS:C$C$ ohjelmallisesti ulkopuolelta!
1. VFS:n (Virtuaalilevyn) ohjelmallinen hallinta
Virtuaalilevy rekisterC6itiin ytimen alustuksessa globaaliin muuttujaan
nimeltC$ window.fs. TC$mC$ tarkoittaa, ettC$ mikC$ tahansa muu
JavaScript-koodi sivullasi (tai selaimesi DevTools-konsoli) voi kC$yttC$C$
sitC$ suoraan!
Kaikki VFS:n funktiot ovat asynkronisia (palauttavat Promisen), joten kC$ytC$
niissC$ aina await -avainsanaa.
YksittC$isen tiedoston kirjoittaminen ja lukeminen:
/ Kirjoitetaan tiedosto ohjelmallisesti (esim. JS-sovelluksesi datan vienti)
await window.fs.writeFile('/home/uusi_data.json', JSON.stringify({ avain:
"arvo" }));
/ Luetaan tiedosto toisesta JS-rutiinista
const sisalto = await window.fs.readFile('/home/uusi_data.json');
console.log(sisalto);
Usean tiedoston siirtC$minen kerralla VFS:C$C$n (Massatuonti):
Jos JS-rutiinisi haluaa ladata useita tiedostoja kerralla nopeasti,
Promise.all on tehokkain tapa ajaa VFS-kirjoitukset rinnakkain:
const tiedostot = [
{ polku: '/home/file1.csv', data: '1;2;3' },
{ polku: '/home/file2.csv', data: '4;5;6' },
{ polku: '/bin/mikro.js', data: 'async function main() { return 0; }' }
];
/ Tallennetaan kaikki yhtC$ aikaa virtuaalilevylle
await Promise.all(tiedostot.map(t => window.fs.writeFile(t.polku, t.data)));
console.log("Massatuonti valmis!");
2. REPL-tulkin ja komentojen ohjelmallinen ajo
Jotta JS-koodisi tai konsoli voi syC6ttC$C$ komentoja komentoriville ja saada
niiden tulokset ulos muuttujiin meidC$n pitC$C$ vain avata Mesh OS:n
index.html:n kC$yttC6liittymC$stC$ pieni "silta" ulkomaailmaan.
Avaa alkuperC$inen index.html (tai C$sken rakentamasi build.js -skriptin
generointivaihe), ja lisC$C$ sen <script> -lohkon alaosaan (heti const session
= new ShellSession("tty1"); jC$lkeen) nC$mC$ "API-koukut":
// 1. REKISTERCI PCCSESSIO IKKUNAAN (jotta voit antaa komentoja
suoraan terminaaliin)
window.meshREPL = session;
// 2. HEADLESS-SUORITTAJA (TC$mC$ on kultaa JS-integraatioissa!)
// TC$mC$ funktio ajaa bash-komennon taustalla, eikC$ tulosta
sitC$ UI-terminaaliin,
// vaan palauttaa tuloksen suoraan JS-muuttujaan!
window.meshExec = async (cmdString) => {
let output = [];
// Luodaan hiljainen "haamusessio" (jakaa saman I/O:n ja
tiedostojC$rjestelmC$n)
const headlessSession = new ShellSession("headless");
headlessSession.env = session.env; // Jaetaan samat
ympC$ristC6muuttujat (esim. PATH)
headlessSession._defaultOut = (msg) => output.push(msg); //
KerC$tC$C$n stdout talteen
headlessSession._defaultErr = (msg) => console.error("Mesh OS
Error:", msg);
await headlessSession.executeRaw(cmdString);
return output.join('
'); // Palautetaan valmis tulostevirta!
};
3. Integraation kC$yttC6esimerkkejC$ (Konsolista tai muusta JS-koodista)
Kun yllC$ olevat sillat on lisC$tty, voit hallita koko kC$yttC6jC$rjestelmC$C$
ulkopuolelta uskomattoman elegantisti!
Esimerkki A: Komennon ajaminen GUI-terminaaliin (Kuin kC$yttC$jC$ olisi
kirjoittanut sen)
/ TC$mC$ tulostaa tuloksen suoraan kC$yttC$jC$n mustaan terminaaliruutuun
await window.meshREPL.executeRaw('echo "Tervehdys ulkoisesta JS-rutiinista!"');
Esimerkki B: Tulosten hakeminen JS-muuttujaan (meshExec -haamusessio)
TC$mC$ on tehokkain tapa integroida Mesh OS osaksi esim. rakenteilla olevaa
visuaalista kC$yttC6liittymC$C$si. Ohjelmasi voi pyytC$C$ Mesh OS:C$C$
prosessoimaan dataa ja palauttamaan sen puhtaana JSONina:
async function haeSuodatetutAsiakkaat() {
// Annetaan Mesh OS:n hoitaa raskas ETL-putkitus taustalla!
const cmd = `cat /home/ladattu.csv | sed 's/;;;/;/g' | csv2json | validate
Puhelinnumero "^400"`;
// Suoritetaan komento headless-tilassa. UI ei vC$lC$hdC$, mutta saamme
tuloksen!
const rawNdjson = await window.meshExec(cmd);
// Parsitaan NDJSON takaisin natiiviksi JS-taulukoksi!
const asiakkaat = rawNdjson.split('
').filter(Boolean).map(JSON.parse);
console.log("Saimme Mesh OS:ltC$ datan taulukkoon:", asiakkaat);
return asiakkaat;
}
TC$llC$ meshExec -funktiolla rakennat tC$ydellisen sillan Mesh OS:n
backend-moottorin ja tulevan, tC$ysin erillisen visuaalisen kC$yttC6liittymC$si
vC$lille. Front-endisi (GUI) voi kC$yttC$C$ Mesh OS:C$C$ tietokantana,
prosessorina ja P2P-reitittimenC$ vain antamalla sille merkkijonomuotoisia
komentoja!