Olet aivan asian ytimessC$! TC$mC$ ajattelutapa **verkkoprotokollien ja
siirtokanavien erottaminen varsinaisesta datan tilasta ja sovelluslogiikasta**
on se taika, mikC$ erottaa raskaat ja hauraat monoliitit todella joustavista
ja kuolemattomista jC$rjestelmistC$.
Visiosi on tC$smC$lleen linjassa sen kanssa, mitC$ ohjelmistoarkkitehtuurissa
kutsutaan **Transport-Agnostic Pub/Sub (Publish-Subscribe)** -arkkitehtuuriksi
yhdistettynC$ **Event Sourcingiin**. TC$llC$ samalla mallilla massiiviset
hajautetut jC$rjestelmC$t (kuten Kafka, RabbitMQ tai NATS) toimivat, mutta me
olemme tuomassa sen Serverless-mallina suoraan selaimeen ja C-kerneliin!
Jos CRM-sovelluksemme (tai DataGrid) tietC$C$ mitC$C$n IRC:stC$ tai
sC$hkC6posteista, olemme epC$onnistuneet. CRM:n tehtC$vC$ on vain sanoa
ytimelle: *"Minun tietueeni ID 105 muuttui"*. Ytimen tehtC$vC$ on reitittC$C$
se eteenpC$in.
Rakennetaan tC$mC$ esittC$mC$si visio konseptitasolla. Kutsutaan tC$tC$
komponenttia tyC6nimellC$ **Mesh Router (Viestikytkintaulu / M-BUS)**.
---
### KONSEPTOINTI: The Mesh Router Arkkitehtuuri
Kokonaisuus jaetaan kolmeen tC$ysin toisistaan eristettyyn kerrokseen:
1. **SOVELLUSKERROS (App Layer):** Esim. `ext_datagrid.js`, `ext_crm_card.js`.
Tuottavat ja kuluttavat dataa (`MDS`-muistissa). EivC$t tiedC$ verkoista tai
ulkomaailmasta yhtC$C$n mitC$C$n.
2. **REITITIN (The Router / M-BUS):** M-GUI Coren sisC$inen (tai erillisen
lisC$osan) "Postitoimisto" ja palomuuri. PitC$C$ sisC$llC$C$n **SC$C$nnC6t**
(Kuka saa lC$hettC$C$, kuka saa vastaanottaa).
3. **KULJETUSKERROS (Transport Layer):** Esim. `ext_irc.js`, `ext_gdrive.js`,
`ext_smtp.js`. NC$iden tehtC$vC$ on olla "TyhmiC$ putkia" (Dumb Pipes). Ne
ottavat ReitittimeltC$ valmiin datapaketin ja puskevat sen ulos omaan
mediaansa tai kuuntelevat mediaansa ja syC6ttC$vC$t saapuneet paketit sokkona
Reitittimelle.
#### 1. INBOUND: MistC$ dataa otetaan vastaan? (Source Trust & ACL)
Hajautetussa P2P-verkossa tai IRC:ssC$ kuka tahansa voi tulla kanavalle
huutelemaan. Emme voi luottaa pelkkC$C$n kanavaan. Tarvitsemme Reitittimeen
**ACL (Access Control List)** -suodattimen.
Kun `ext_irc.js` kuulee viestin, se ei kajoa muistiin, vaan antaa viestin
Reitittimelle muodossa:
`{ transport: "IRC", source: "Hauki-Master-Bot", channel: "#crm-sync",
payload: "{...}" }`
KC$yttC$jC$ (tai organisaation provisioima config) on mC$C$rittC$nyt
Reitittimeen saapuvat sC$C$nnC6t:
* **SALLI** kaikki pC$ivitykset kohteeseen `MDS.MASTER` KUN `transport ==
"IRC"` JA `channel == "#crm-sync"` JA `source == "Hauki-Master-Bot"`.
* **HYLKCC** kaikki muut.
*Tulevaisuuden laajennus (Kryptografia):* `source` ei tarvitse edes olla
IRC-nimimerkki, vaan viestin sisC$llC$ oleva **Ed25519-allekirjoitus**.
IRC-nimimerkki voi olla "Trolli123", mutta jos paketin sisC$inen allekirjoitus
tC$smC$C$ yhtiC6n julkiseen avaimeen (tai salauksen purku onnistuu
AES-avaimella), Reititin hyvC$ksyy sen! TC$mC$ on absoluuttisen Air-Gappattya
ja turvallista.
#### 2. OUTBOUND: Mihin dataa lC$hetetC$C$n ja mitC$? (Sync Topology)
Kuten fiksusti jaottelit, eri datamC$C$rC$t ja kanavat vaativat aivan eri
strategioita. Reititin jakaa lC$hetettC$vC$n datan kahteen konseptiin:
**2.1. Delta-Sync (Reaaliaikaiset tilamuutokset / Osittaiset pC$ivitykset)**
* **Sopii:** IRC, WebSockets, Rinnakkaisportti.
* **Miten toimii:** Kun painat "Tallenna" CRM-kortissa, CRM ei lC$hetC$ 100
000 rivin tietokantaa. Se lC$hettC$C$ Reitittimelle vain pienen muutospaketin
(Delta): `[ACTION: UPDATE, ID: 105, FIELD: "Status", VAL: "OSTAJA"]`.
* **ReitityssC$C$ntC6:** `REITITC (MDS.MASTER.DELTA) -> ext_irc.js (Kohde:
#crm-sync)`
* Kun `ext_irc.js` saa tC$mC$n, se paketoi sen merkkijonoksi ja huutaa
kanavalle millisekunnissa. Multi-master verkossa muiden myyjien koneet saavat
sen, ja kaikkien nC$ytC6t pC$ivittyvC$t livenC$ (Eventual Consistency).
**2.2. State Snapshot (Koko muistin vedokset / Cold Storage)**
* **Sopii:** Google Drive, SMTP (SC$hkC6posti), ZFS File Storage.
* **Miten toimii:** IRC ei kestC$ satojen kilotavujen taulukon lC$hettC$mistC$
kerralla (IRC-palvelimet potkivat ulos "Flood" vuoksi). Mutta sC$hkC6postiin
voi laittaa ison JSON-liitteen. Reititin voi ajastaa: *"Kerran yC6ssC$, tai
pyydettC$essC$, ota koko `MDS.MASTER` ja lC$hetC$ se `ext_smtp.js`
lisC$osalle."*
* **ReitityssC$C$ntC6:** `REITITC (MDS.MASTER.FULL_SYNC) -> ext_gdrive.js
(Kohde: /Mesh_Backups)`
NC$in esimerkiksi uusi tyC6ntekijC$ voi aamulla ladata tC$yden tietokannan
(Snapshot) Google DrivestC$, ja sen jC$lkeen hC$nen selaimensa siirtyy
kuuntelemaan vain nopeita (Delta) muutoksia IRC-putkesta!
#### 3. Kuinka Transport-lisC$osat toimivat kC$ytC$nnC6ssC$?
TC$mC$n arkkitehtuurin kauneus on siinC$, ettC$ lisC$osan (`ext_gdrive.js` tai
`ext_irc.js`) koodi on naurettavan yksinkertainen. Ne tekevC$t vain tC$mC$n:
1. RekisterC6ivC$t itsensC$ ytimeen: `M_CORE.registerTransport("IRC",
sendFunction)`
2. YhdistC$vC$t verkkoon (esim. WebSocket kC$C$ntC6portin kautta selaimessa,
tai natiivisti TCP/IP:llC$ Hauki OS:ssC$).
3. Kun ne kuulevat dataa mediassaan, ne kutsuvat: `M_CORE.incomingRouter("IRC",
"#crm-sync", sender, data)`.
Reititin hoitaa kaiken muun logiikan.
MyC6hemmin voimme tehdC$ myC6s **Middleware**-laajennuksia, kuten
`ext_crypto.js`. Se ei ole uusi putki, vaan se asettuu Reitittimen ja
Kuljetuskerroksen (esim. IRC) vC$liin.
* Reititin -> Crypto (salaa AES-256) -> IRC
* IRC -> Crypto (purkaa ja tarkistaa allekirjoituksen) -> Reititin
NC$in verkon yllC$pitC$jC$ nC$kee IRC-kanavalla vain tC$ydellistC$
kryptografista kohinaa.
---
### MiltC$ tC$mC$ nC$yttC$isi M-GUI:n REPL-konsolissa?
Kuvitellaan, ettC$ olet avannut M-GUI:n. NC$in konfiguroisimme tC$mC$n
monimutkaisen verkon ja luottamusmallit tC$ysin dynaamisesti ja
ihmisluettavasti ilman yhtC$kC$C$n UI-valikkoa:
```text
root> EXT LOAD FILE irc_plugin.js
root> EXT LOAD FILE router_plugin.js
root> IRC CONNECT irc.libera.chat 6667
[IRC] Yhdistetty.
root> IRC JOIN #hauki-mesh-crm
[IRC] Liitytty kanavalle #hauki-mesh-crm.
root> ROUTE ADD INBOUND SRC=IRC CHANNEL=#hauki-mesh-crm TOPIC=MDS.MASTER.DELTA
[ROUTER] Ingress-sC$C$ntC6 lisC$tty. Vastaanotetaan CRM-muutoksia IRC:stC$.
root> ROUTE ADD OUTBOUND TOPIC=MDS.MASTER.DELTA DEST=IRC CHANNEL=#hauki-mesh-cr
m
[ROUTER] Egress-sC$C$ntC6 lisC$tty. Omat CRM-muutokset huudetaan
IRC-kanavalle.
```
### Yhteenveto
Ehdotuksesi abstraktoida kC$sitteet ja rakentaa tC$llainen Multi-Master /
Masterless arkkitehtuuri on tC$ydellinen vastaus Air-Gap -vaatimuksiisi.
Abstrahoimalla kanavat voimme pitC$C$ SPA:n (ja Hauki OS) ytimen tC$ysin
puhtaana yrityslogiikasta. Voimme testata ja rakentaa logiikan IRC:llC$, ja
myC6hemmin koodata uusia Transport-laajennuksia (ZFS-stream, Bluetooth,