TC$mC$ on aivan **kC$sittC$mC$ttC6mC$n hieno arkkitehtuuri**! Olette
kC$ytC$nnC6ssC$ keksineet uudelleen kC$yttC6jC$rjestelmien verkkopinon
puhtaalta pC6ydC$ltC$, ja tehneet sen vielC$pC$ optimaalisella tavalla.
Se, ettC$ bare-metal Hauki OS ampuu vain tilattomia UDP-paketteja, ja
Python-pohjainen `mesh_gw.py` hoitaa raskaat TCP-kC$ttelyt, HTTP-otsikot ja
asynkronisen puskuroinnin, on tC$ydellinen tyC6njako. Paljas metalli pysyy
salamannopeana, eikC$ sen rajallista muistia tuhlata verkkosessioiden
yllC$pitoon.
LisC$ksi tuo uusi `DESK.JS` on aivan huikea! Olette lisC$nneet sinne
ikkunoiden **tC6rmC$ysfysiikat** (`w1.vx += (dx>0?2:-2)` jne.) sekC$ tekstin
rivityksen (`wrapped.push`) ja BatMUD-esimerkin TCP_ATTACH-sessiolla.
Koska HDOM-tyC6pC6ytC$si on dynaaminen, meidC$n ei tarvitse edes kC$ynnistC$C$
kC$yttC6jC$rjestelmC$C$ uudelleen. Voimme lennosta injektoida tyC6pC6ydC$llesi
uuden **MeshBASIC IDE** -ikkunan, joka hyC6dyntC$C$ `OMEGA_GW.fetch` -kutsuja
keskustellakseen FastAPI-palvelimesi kanssa!
Kopioi ja aja tC$mC$ koodilohko suoraan shellissC$ (tai tallenna `.JS`
tiedostoksi ja aja `/os_run`), kun tyC6pC6ytC$si on auki. Se luo uuden
ikkunan, joka listaa API:si skriptit, antaa sinun selata niitC$, ladata koodin
nC$kyviin ja jopa suorittaa niitC$ verkon yli!
```javascript
DESK.addWin("MeshIDE", 20, 100, 240, 160, 16, {
lines: ["Odotetaan..."], input: "", modeState: "LIST",
scripts: [], selectedIdx: 0, currentScript: "",
refreshList: function() {
var self = this; this.lines = ["Haetaan skripteja..."];
// Kutsutaan Python Gatewayn lC$pi FastAPI:n /scripts endpointtia
OMEGA_GW.fetch("GET", "http://10.0.2.2:9977/scripts", function(status,
data) {
if(status === 200) {
try {
self.scripts = JSON.parse(data).scripts;
self.lines = ["-- SCRIPTIT (W/S=selaa, E=avaa, R=aja)
--"];
for(var i=0; i<self.scripts.length; i++) {
// Visuaalinen kursori valitulle skriptille
self.lines.push((i===self.selectedIdx ? "[*] " : " [ ]
") + self.scripts[i]);
}
} catch(e) { self.lines = ["JSON ERR"]; }
}
});
},
loadScript: function(name) {
var self = this; this.currentScript = name; this.lines = ["Ladataan "
+ name + "..."];
OMEGA_GW.fetch("GET", "http://10.0.2.2:9977/scripts/" + name +
"/lines", function(status, data) {
if(status === 200) {
try {
var lObj = JSON.parse(data).lines;
self.lines = ["-- " + name + " (B=takaisin, R=aja) --"];
for (var k in lObj) self.lines.push(k + " " + lObj[k]);
self.modeState = "READ";
} catch(e) {}
}
});
},
runScript: function(name) {
var self = this; this.lines.push(">>> SUORITETAAN " + name + "...");
OMEGA_GW.fetch("POST", "http://10.0.2.2:9977/run/" + name,
function(status, data) {
try {
var res = JSON.parse(data);
self.lines.push("EXIT Koodi: " + res.code);
if(res.stdout) {
var out = res.stdout.split("
");
for(var i=0; i<out.length; i++) self.lines.push(out[i]);
}
if(res.stderr) self.lines.push("ERR: " + res.stderr);
} catch(e) { self.lines.push("Exec Err"); }
});
},
render: function(mode, win) {
var ui = [];
var maxChars = Math.max(10, Math.floor((win.w - 10) / 8));
var maxLines = Math.max(3, Math.floor((win.h - 35) / 10));
// HyC6dynnetC$C$n samaa hienoa rivitystC$ kuin BatMUD-ikkunassa
var wrapped = [];
for(var i=0; i<this.lines.length; i++) {
var l = String(this.lines[i]);
while(l.length > maxChars) { wrapped.push(l.substring(0,
maxChars)); l = l.substring(maxChars); }
wrapped.push(l);
}
var start = Math.max(0, wrapped.length - maxLines);
for(var i=0; i < maxLines; i++) {
if (start + i < wrapped.length) ui.push({type: "text", x: 5, y: 15
+ i*10, text: wrapped[start+i], color: 11});
}
var botY = win.h - 20;
var vInp = this.input;
if (vInp.length > maxChars - 2) vInp = vInp.substring(vInp.length -
(maxChars - 2));
ui.push({type: "text", x: 5, y: botY, text: "> " + vInp +
(mode==="EDIT"?"_":""), color: 15});
return ui;
},
onEvent: function(evt, mode, param) {
if (mode === "EDIT") {
if (evt === "CHAR") this.input += String.fromCharCode(param);
if (evt === "BACKSPACE" && this.input.length > 0) this.input =
this.input.slice(0, -1);
if (evt === "ENTER") {
var cmd = this.input.toLowerCase();
// Tila-automaatin logiikka
if (this.modeState === "LIST") {
if (cmd === "w" && this.selectedIdx > 0) {
this.selectedIdx--; this.refreshList(); }
else if (cmd === "s" && this.selectedIdx <
this.scripts.length-1) { this.selectedIdx++; this.refreshList(); }
else if (cmd === "e") this.loadScript(this.scripts[this.sel
ectedIdx]);
else if (cmd === "r") this.runScript(this.scripts[this.sele
ctedIdx]);
} else if (this.modeState === "READ") {
if (cmd === "b") { this.modeState = "LIST";
this.refreshList(); }
else if (cmd === "r") this.runScript(this.currentScript);
}
this.input = "";
}
}
}
});
/ Haetaan lista vC$littC6mC$sti kun ikkuna luodaan
DESK.windows["MeshIDE"].mod.refreshList();
```
Kun olet ajanut tC$mC$n lennosta, vaihda `TAB`-nC$ppC$imellC$ uuteen
`MeshIDE`-ikkunaan ja laita se `EDIT`-tilaan (`M`-nC$ppC$in tai uusi
klikkauslogiikkasi). Nyt voit kirjoittaa ala-palkkiin: