TC$mC$ on tC$ysin oikea arkkitehtuurinen suunta! Siirrymme nyt yksittC$isistC$
"injektio-skripteistC$" aitoon Pakettienhallintaan (Package Manager).
Kun koodi jaetaan loogisiin alihakemistoihin ja paketoituihin tiedostoihin,
varmistamme samalla, ettC$ jokainen erillinen JS-lC$hdekooditiedosto pysyy
tiukasti alle 150 rivin modulaarisena kokonaisuutena. Backend toimii nC$in
erC$C$nlaisena "App Storena" tai "Apt-repona", josta Mesh OS voi pyytC$C$
uusia ominaisuuksia tai backend voi tyC6ntC$C$ niitC$ automaattisesti
haluttuihin sessioihin.
TC$ssC$ on ehdotus OMEGA-verkon viralliseksi moduuliarkkitehtuuriksi ja
tyC6kaluksi sen hallintaan.
1. Repositorion Hakemistorakenne (codebase/)
Hakemistorakenne kannattaa pitC$C$ litteC$nC$, mutta tarpeeksi erottelevana.
* codebase/gui/ Graafiset kC$yttC6liittymC$komponentit (Ikkunamanagerit,
teemat, napit).
* codebase/repl/ REPL:n laajennukset (Uudet parserisC$C$nnC6t, uudet tuetut
komennot, syntaksin korostus).
* codebase/vfs/ LevyjC$rjestelmC$n laajennukset (Tiedostoselain, uudet
tietokanta-adapterit, hakutyC6kalut).
* codebase/sysutils/ YllC$pitotyC6kalut (dmesg_viewer.js, task_manager.js,
network_monitor.js).
* codebase/daemons/ Taustaprosessit, joilla ei ole GUI:ta (esim.
sync_service.js, joka pollaa verkkoa hiljaa taustalla).
* codebase/libs/ Jaetut kirjastot, joita muut ohjelmat voivat hyC6dyntC$C$
(esim. salausalgoritmit tai yhteiset piirtorutiinit).
2. Moduulin Standardiformaatti
Jotta load_to_session.sh voi ladata mitC$ tahansa, standardoimme moduulien
rakenteen. Moduulit tallennetaan puhtaina .js -tiedostoina codebase/
-kansioihin.
Esimerkki: codebase/sysutils/dmesg.js
/ Mesh OS Application: Dmesg Viewer
window.MeshOS.intent = (function(oldIntent) {
return function(req) {
if (req.op === 'spawn_dmesg') {
const w = new window.MeshOS.Process('dmesg');
const d = document.createElement('div');
d.style = 'border:1px solid #ff0; padding:10px; background:#220;
color:#ff0; width:400px; height:300px; overflow-y:auto; font-family:monospace;
font-size:12px; margin:5px;';
document.getElementById('screen-' + window.MeshEnv.get('CURRENT_WS')).app
endChild(d);
const render = (msg) => { d.innerHTML += `<div>${msg}</div>`;
d.scrollTop = d.scrollHeight; };
window.MeshOS.Syslog.buffer.forEach(l => render(`[PID ${l.p}] ${l.d}`));
const oldPush = window.MeshOS.Syslog.push.bind(window.MeshOS.Syslog);
window.MeshOS.Syslog.push = (p, f, data) => { oldPush(p, f, data);
render(`[PID ${p}] ${data}`); };
return w.pid;
}
return oldIntent(req);
};
})(window.MeshOS.intent);
3. AsennustyC6kalu: load_to_session.sh
TC$mC$ skripti on Mesh-verkon virallinen jakelutyC6kalu (Dispatcher). Se lukee
koodin tiedostosta, paketoi sen turvallisesti JSON-muotoon jq:n avulla
(vC$lttC$en kaikki escape-ongelmat) ja lC$hettC$C$ sen selaimeen
install_module -intenttinC$, jolloin selaimen ModuleLoader asentaa sen
VFS:C$C$n ja suorittaa heti.
..
Miten tC$mC$ muuttaa tyC6nkulkua?
Jatkossa sinun ei tarvitse kirjoittaa curl-pyyntC6jC$. Jos haluat pC$ivittC$C$
kellon (joka on tallennettu tiedostoon codebase/gui/clock.js), koodaat vain
tuon pienen tiedoston ja ajat:
./load_to_session.sh <SESSION_ID> gui clock.js
Selain ottaa koodin vastaan asynkronisesti tapahtumavC$ylC$ltC$, ajaa sen
muistiin ja tallentaa VFS:C$C$n nimellC$ gui/clock.js.
Haluatko, ettC$ siirrC$mme seuraavaksi C$sken rakentamamme ytimen ja
ModuleLoaderin lopulliseen "ROM-puskuriin" siten, ettC$ selain osaa
automaattisesti hakea ja ladata kaiken VFS-tietokannastaan kC$ynnistyksen
yhteydessC$?