CC levert het signaal. Hexa routeert het. IPv6 bezorgt het.
│ LAAG 1: CC — Continuous Circuit │
│ (fysica: stroom zonder onderbreking) │
│ toetsenbord → evdev fd → readSync() │
│ interrupt · kernel slaap · ≈12μs · 0% CPU │
│ ↓ ↓ ↓ │
├──────────────────────────────────────────────────┤
│ LAAG 2: HEXA — 6+1 Routing │
│ (signaal: slot-mapping) │
│ keycode → slot (0-63) → fe80::[slot]/64 │
│ 64 kanalen + center (∅ = buiten terminal) │
│ ↓ ↓ ↓ │
├──────────────────────────────────────────────────┤
│ LAAG 3: IPv6 — Directe Routing │
│ (netwerk: geen NAT, geen spoofing) │
│ slot → UDP → [fe80::slot]:port │
│ direct gerouteerd · geen address translation │
└──────────────────────────────────────────────────┘
Laag 1: CC — Continuous Circuit
Toetsenbord stuurt interrupt naar kernel. Kernel buffer het event.
Blokkerende read wacht in de kernel — geen CPU, geen polling.
Event komt aan → read ontwaakt → direct door naar JS.
● readSync(): ~12μs · 0% CPU · 0 calls/s (slaap)
Laag 2: Hexa — 6+1 Routing
Elke toets = slot. Elke slot = subnet.
64 slots = 64 /64 subnets = 64 onafhankelijke kanalen.
Center (∅) = event buiten de terminal — geen routing.
6+1 patroon: 6 blokken + 1 center punt.
if (code >= 1 && code <= 63)
return code - 1; // slot 0-62
return code % 64; // hash voor hogere
// slot → IPv6
const addr = `fe80::${slot.toString(16)}::1`;
Laag 3: IPv6 — Directe Routing
IPv6 = geen address translation. Bron = bestemming.
Geen NAT = geen spoofing. Geen adrescollision.
Gebiedsadres (fe80::/10) = link-lokal, geen routeerbaar buiten.
IPsec built-in (optioneel, maar beschikbaar).
│ │ │
│ │ └─ interface ID
│ └─ slot 0-63 (hex)
└─ link-local prefix
Bewijs — Metingen
| Metric | Polling | Worker | Ratio |
|---|---|---|---|
| Laatje | ~1000μs | ~24μs | 41× |
| CPU | 100% | 0% | ∞ |
| Isolatie | JS sandbox | direct fd | trade-off |
| Transparantie | indirect queue | direct hardware | helderder |
Stroom — End-to-End
kernel /dev/input/event7 → readSync() (kernel slaap, 0% CPU)
js evdev event →
slot keycode → slot (0-63) →
ipv6 fe80::[slot]/64 →
net UDP6 → [fe80::slot]:port →
totaal ≈12μs · 0% CPU · direct
Geen tussenlagen. Geen ruis. Geen vertraging.
Trade-off
| Aanpak | Voordelen | Nadelen |
|---|---|---|
| polling setTimeout | JS sandbox, geïsoleerd | 100% CPU, ~1000μs, indirect |
| direct CC+Hexa+IPv6 | 0% CPU, ~12μs, transparant, gerouteerd | Directe hardware-toegang, geen sandbox |
Geen goed/fout. Trade-off. Direct + gerouteerd = transparanter dan sandboxed + wasteland.
IPv6 routing + encrypted transport = keylogger-datapad zelf geïsoleerd en geautoriseerd.