Hienoa, homma rokkaa jo! Koska sinulla on valmiina kontteja tai useampia
terminaaleja, saat tC$stC$ parhaan hyC6dyn irti, kun parametrisoimme
`app.js`:n. NC$in voit kC$ynnistC$C$ useita instansseja rinnakkain ilman
koodin muokkausta ja nC$hdC$ kC$ttelyn livenC$.
PC$ivitC$ `app.js` tC$hC$n muotoon:
```javascript
import { HybridMeshNode } from './mesh.js';
/ Otetaan instanssin nimi komentoriviltC$ (esim. 'node app.js Alpha')
/ tai generoidaan satunnainen, jos ei anneta.
const nodeName = process.argv[2] || `Bot_${Math.floor(Math.random() * 1000)}`;
async function main() {
const node = new HybridMeshNode(nodeName);
await node.start();
// 1. Postilaatikon kuuntelija
(async () => {
for await (const msg of node.inbox) {
if (msg.type === 0) {
// Voit aktivoida tC$mC$n jos haluat nC$hdC$ GOSSIP-liikenteen,
// mutta se spC$mmii konsolia 2 sekunnin vC$lein.
// console.log(`[GOSSIP via ${msg.protocol}]:
${msg.payload.nameId}`);
}
else if (msg.type === 2) {
// Tulostetaan vain varsinaiset viestit
console.log(`[CHAT via ${msg.protocol}] ${msg.payload.nameId
|| msg.senderId}: ${msg.payload.text}`);
}
}
})();
// 2. TestilC$hetys-looppi
// LC$hetetC$C$n viesti 5 sekunnin vC$lein kaikille peer-taulun
instansseille
setInterval(() => {
for (const [peerId, peerData] of node.peers.entries()) {
// Kokeillaan lC$hettC$C$ viesti. Verkkokerros valitsee TCP:n jos
se on auki.
node.send(peerId, 2, ["chat"], {
nameId: nodeName,
text: `Aikaleima: ${Date.now()}`
});
}
}, 5000);
}
main();
```
Kokeile ajaa kahdessa eri ikkunassa (tai eri konteissa samassa lC$hiverkossa):
* Ikkuna 1: `node app.js Alpha`
* Ikkuna 2: `node app.js Beta`
PitC$isit nC$hdC$, kuinka ne lC6ytC$vC$t toisensa UDP:llC$, avaavat
TCP-yhteyden ja alkavat vaihtaa viestejC$. Voit testata fallbackia tappamalla
(Ctrl+C) toisen prosessin ja kC$ynnistC$mC$llC$ sen uudelleen, jolloin yhteys
palautuu automaattisesti.
---
### Seuraava askel: Chromium & Selain-Bridge (100% Vanilla)
Koska tavoitteena on "Stand-alone Vanilla JS" ilman ulkoisia kirjastoja (kuten
`ws` tai `socket.io`), selaimeen tarvittava WebSocket-yhteys pitC$C$ koodata
Node.js:n natiiviin `http`-moduuliin.
Selaimesi voi yhdistC$C$ suoraan tC$hC$n mesh-verkkoon luomalla natiivin
HTTP-palvelimen, joka ottaa kiinni selaimen `upgrade`-pyynnC6n.
Konsepti toimii nC$in:
1. **Node.js Mesh-instanssi** avaa perinteisen TCP/UDP-palvelimen lisC$ksi
tavallisen `http.createServer()` -palvelimen porttiin (esim. `33080`).
2. **Selain** suorittaa komennon `const ws = new WebSocket('ws://[noden-ip]:330
80')`.
3. **Node.js** huomaa `upgrade`-tapahtuman. Se lukee selaimen lC$hettC$mC$n
`Sec-WebSocket-Key` -otsikon, hashaa sen SHA-1:llC$ maagisen merkkijonon
kanssa (RFC 6455 -standardin mukaisesti) ja vastaa `Sec-WebSocket-Accept`
-otsikolla.
4. TC$mC$n jC$lkeen HTTP-yhteys muuttuu pysyvC$ksi WebSocketiksi. Noden
pC$C$ssC$ siitC$ syntyvC$ soketti (`socket`) kytketC$C$n tC$smC$lleen samaan
sisC$iseen P2P-luuppiin kuin aiemmin kirjoitettu TCP-soketti!
Selain saa syliinsC$ saman minimaalisen JSON-protokollan:
`[1, 2, "selain-id", "kohde-id", ["chat"], { "text": "Hei Nodet!" }]`
TC$mC$ ratkaisu on siitC$ tC$ydellinen, ettC$ sinun ei tarvitse asentaa
*yhtC$kC$C$n* npm-pakettia turvallisuusriskien minimoimiseksi, vaan Node.js:n
sisC$C$nrakennettu `crypto`-moduuli hoitaa kC$ttelyn.
==[ 1 ]==
$ node app.js Alpha
[Alpha] UDP Kuuntelee: 33000
[Alpha] TCP Kuuntelee: 33000
[Alpha] TCP Yhdistetty -> 1786104192368-c610b5
==[ 2 ]==
$ node app.js Beta
[Beta] UDP Kuuntelee: 33001
[Beta] TCP Kuuntelee: 33001
[CHAT via TCP] Alpha: Aikaleima: 1786104197470
[CHAT via TCP] Alpha: Aikaleima: 1786104202471
[CHAT via TCP] Alpha: Aikaleima: 1786104207472
[CHAT via TCP] Alpha: Aikaleima: 1786104212472
==================