Testclient fase 1: er is geen Evolu-client voor Node, dus die stellen we samen

Het plan is gepromoveerd naar Actief/003-Testclient en tier A, en fase 1 is af.

De uitkomst die het plan als eerste wilde weten: @evolu/nodejs 3.1.0 bevat geen
client. Het pakket levert de relay plus losse bouwstenen, maar er is geen
createEvoluDeps voor Node zoals @evolu/web die voor de browser heeft. De
afhankelijkheden voor createEvolu worden nu samengesteld in
tools/relay-client/src/evolu-node.js, uit de in-memory workers van
@evolu/common; src/client.js is de publieke kant met eigenaars en blobs.

Vier dingen zaten in de weg en alle vier faalden ze stil, met een instantie die
het lijkt te doen tot de eerste schrijfactie: de ontbrekende installPolyfills
(Node 24 mist Map.getOrInsertComputed), createEvoluDeps overslaan, de
AsyncDisposableStack van initSharedWorker laten vallen, en workers zonder eigen
reportDefect. Dat laatste is waarom de andere drie te vinden waren. Uitgeschreven
in PLAN.md 4e.

tests/test_client_lokaal.mjs schrijft daarom een blob weg en leest hem terug in
plaats van alleen een instantie te maken, en heeft een wachthond: bij een defect
in een worker blijft de suite anders hangen in plaats van rood te worden, en dat
gebeurde bij de mutatietoets letterlijk. Beide mutaties lieten de juiste toets
omvallen.

Nog niet geprobeerd: praten met de relay. Daarvoor is het adres van de Umbrel
nodig en dat komt van de gebruiker; het gaat niet in deze publieke repo.

Suite: 405 goed, 0 fout over alle acht de toetsen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harmen
2026-09-09 12:59:55 +02:00
co-authored by Claude Opus 5
parent 9ec39b1cd0
commit de955b607d
12 changed files with 1424 additions and 1 deletions
@@ -0,0 +1,69 @@
# Taken - Testclient
> Prioriteit: **A** | Afhankelijk van:
>
> **Nieuw en meteen actief op 09-09-2026.** Het masterplan werd dezelfde dag geschreven en op verzoek van
> de gebruiker direct gepromoveerd. Nummer 003, onder de bestaande 005: tier A was leeg en dit is nu de
> lopende focus, dus de bovenkant van de reeks klopt weer.
>
> **Waarom dit plan er is:** vier beweringen over Evolu Relay rusten op redenering uit de broncode in
> plaats van op een proef, waaronder dat blokkeren pas bij de volgende verbinding werkt. Zonder een cliënt
> die geen hardware nodig heeft, blijft dat zo.
## Volgende stap
- [ ] **De cliënt met de relay laten praten.** De samenstelling werkt lokaal; wat nog niet geprobeerd is,
is `transports` met `createOwnerWebSocketTransport` erin. **Hiervoor is het adres van de relay
nodig**, en dat komt van de gebruiker en gaat niet in de repo; zie [OPEN.md](OPEN.md) punt 6
## Fase 1 - de samenstelling (af)
- [x] **`@evolu/common` 8.7.0 en `@evolu/nodejs` 3.1.0 geïnstalleerd in `tools/relay-client/`
(09-09-2026)**
- [x] **Vastgesteld dat `@evolu/nodejs` géén cliënt bevat**, alleen de relay plus losse bouwstenen. De
afhankelijkheden voor `createEvolu` worden daarom zelf samengesteld in `src/evolu-node.js`; zie
[PLAN.md](PLAN.md) §4e voor de vier valstrikken die dat kostte
- [x] **Bewezen dat het werkt zonder relay (09-09-2026):** een eigenaar aanmaken, een Evolu-instantie met
`transports: []`, een rij met een `Uint8Array`-kolom wegschrijven en teruglezen. De bytes komen er
ongeschonden uit en het proces sluit schoon af, zonder defect en zonder te blijven hangen
## Fase 2 - de opdrachtregel
- [ ] Een eigenaar aanmaken en bewaren: mnemonic plus database in een eigen map, in een pad dat
gitignored is. Het `OwnerId` wordt afgedrukt, de mnemonic niet
- [ ] Een register van eigenaars: aanmaken, opsommen, teruglezen, weggooien
- [ ] Verbinden met de relay via `createOwnerWebSocketTransport`, met het adres uit een instelling
- [ ] Een blob schrijven met een instelbare omvang, en teruglezen
- [ ] De losse WebSocket-poging die de HTTP-statuscode wél te zien krijgt; zie [OPEN.md](OPEN.md) punt 1
## Fase 3 - het bedieningsvlak
- [ ] De HTTP-server met de pagina, in de stijl van de twee statuspagina's
- [ ] De lijst met eigenaars, met per eigenaar de toestand en de knoppen uit [PLAN.md](PLAN.md) §4b
- [ ] Het log, met tijdstip per gebeurtenis
## Fase 4 - de proeven
De zes proeven staan in [PLAN.md](PLAN.md) §4c. Ze zijn handwerk en hebben een draaiende relay nodig, dus
ze komen na fase 2 en kunnen deels vóór fase 3.
- [ ] Onbekende eigenaar met het venster dicht: 401, en een regel in de weigerlijst
- [ ] Toelaten en opnieuw verbinden: komt de hele geschiedenis alsnog binnen
- [ ] Blokkeren tijdens een lopende verbinding: blijft hij schrijven tot de volgende verbinding
- [ ] Het venster van twee minuten met de pagina dicht
- [ ] Eén blob boven `RELAY_MAX_WRITE_BYTES`, en meerdere kleinere die samen groter zijn
- [ ] Twee eigenaars tegelijk verbonden
- [ ] **De uitkomsten terugschrijven** naar §10 van
[Upstream-evolu-relay.md](../../../Referenties/Upstream-evolu-relay.md) en naar open punt 10 van het
plan **Umbrelapp**. Dit is de opbrengst van het hele plan; zonder deze stap blijft het gereedschap
zonder resultaat
## Fase 5 - de toetsen
Wat automatisch kan is klein, en [PLAN.md](PLAN.md) §7 zegt waarom.
- [ ] Het register: aanmaken, teruglezen, een naam die al bestaat, een half aangelegde map
- [ ] Een vaste mnemonic met een vast verwacht `OwnerId`. Dit is de toets die omvalt als Evolu onder ons
iets anders gaat doen
- [ ] Het lezen van de opdrachtregel
- [ ] De nieuwe toetsen mutatie-testen, zoals `HomeGit/CLAUDE.md` voorschrijft