➕ Nieuwe berichten live in de open berichtenbox (_volgen) - #164
Draft
ericwout-overheid wants to merge 3 commits into
Draft
ericwout-overheid wants to merge 3 commits into
ericwout-overheid wants to merge 3 commits into
Conversation
…rugval Staat de berichtenbox open en komt er een bericht binnen, dan meldt het stelsel dat nu zelf (`GET /api/v1/berichten/_volgen`, MinBZK/moza-poc-fbs- berichtenbox#336). De berichtenbox hoeft niet meer elke vijftien seconden de lijst op te vragen. De stroom begint met `volgen-gestart`. Dan haalt de berichtenbox één keer de lijst op, langs hetzelfde pad als een polltik. Daarna komt elk bericht als `bericht-bijgekomen`, met de naam van de afzender erbij. Het gaat als gewijzigde lijst naar de bron, die er een binnenkomer van maakt. Ontdubbelen gebeurt op `berichtId`, want een bericht op het grensvlak kan in allebei zitten. Een bericht dat binnenkomt terwijl die lijst nog onderweg is, blijft staan; anders legt de lijst zich eroverheen en verdwijnt het weer. Een waakhond breekt de verbinding af na 45 seconden zonder hartslag, want na een slaapstand merkt de browser het niet. Opnieuw verbinden gebeurt na 1, 2, 5, 10 en daarna 30 seconden, met spreiding; `volgen-gestart` zet die reeks terug. Na `sessie-verlopen` en bij een 409 draait het bestaande herstel. Een 503 wacht `Retry-After` af. Kent de keten `_volgen` niet (404, 405, of 406 zoals de publieke omgeving nu antwoordt), of komen drie verbindingen op rij niet tot stand, dan valt de berichtenbox stil terug op het periodiek navragen. Geen melding: de lijst werkt gewoon, alleen verschijnen nieuwe berichten wat later. `pagehide` sluit de stroom en `pageshow` verbindt opnieuw, behalve als er intussen een andere persona gekozen is. Een verborgen tabblad blijft verbonden. `?volgen=0` of `setting:berichtenbox-volgen` op 0 zet de stroom uit, voor een demonstratie van allebei. De SSE-parser van `_ophalen` is nu `leesSse` en wordt door beide gedeeld. De dev-proxy `server/proxy.js` kapte elke stroom af: zijn `proxyTimeout` van 15 seconden is korter dan de hartslag van 20. Voor `text/event-stream` staan de timeouts nu uit, en die antwoorden worden niet meer in het geheugen verzameld. Helpt MinBZK/MijnOverheidZakelijk#939 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ericwout-overheid
had a problem deploying
to
pr164
September 21, 2026 15:59 — with
GitHub Actions
Failure
🚀 Preview DeploymentYour changes have been deployed to a preview environment: proef: https://proef-pr164-pm-5sj.rig.prd1.gn2.quattro.rijksapps.nl 📱 Scan to open on mobileThis deployment will be automatically cleaned up when the PR is closed. |
Uit de review van #164. Een verbinding telt pas als gezond na haar eerste hartslag, en niet al bij `volgen-gestart`. Pas dan gaat de reeks tussenpozen terug naar het begin. Zette `volgen-gestart` hem terug, dan verbond een stroom die telkens net na de start wegvalt elke seconde opnieuw, haalde elke keer de lijst op, en gaf nooit op. Zo'n stroom telt nu mee voor de terugval op navragen. Mislukt de lijst terwijl de stroom openstaat, dan blijft de stroom open en probeert de berichtenbox het na vijftien seconden opnieuw. Eerst brak hij de gezonde stroom af en verbond hij opnieuw, en de nieuwe `volgen-gestart` haalde de lijst meteen weer op: drie mislukkingen in drie seconden, en het bijwerken hield op. Nu houdt hij het een halve minuut vol, net als het navragen. Een melding die geen JSON is of niet te verwerken valt, wordt overgeslagen met een `console.error`. Eerst nam die fout de verbinding mee, onder de noemer "verbinding viel weg", met hetzelfde gevolg als hierboven. Een 409 bij het openen draait één keer een nieuwe ronde. Komt er daarna weer een 409, dan ligt het niet aan de sessie en valt de berichtenbox terug op navragen, in plaats van na twee rondes op te houden met een mededeling terwijl de lijst gewoon werkt. Een 429 wacht net als een 503 `Retry-After` af, en een 200 zonder `text/event-stream` telt als mislukte verbinding. Teruggedraaid: de wijziging in `server/proxy.js`. Die proxy hoort bij de react-islands; de berichtenbox gaat lokaal via `server/keten-proxy.js`, dat al een timeout van 3600 s heeft. De bewering in de vorige commit dat de berichtenbox er last van had, klopte niet. Tests voor elk van deze paden, en voor `tikNogEens`, het opnieuw aanbieden na een verwerkingsfout, een 409 van de lijst terwijl de stroom openstaat en de waakhond tijdens het openen. De tests voor `pagehide` en `stopPollen()` slaagden ook zonder dat de stroom dichtging, omdat de waakhond hem binnen hun wachttijd toch afbrak; die kijken nu meteen. Verouderde commentaren die alleen over pollen spraken, zijn bijgewerkt. Helpt MinBZK/MijnOverheidZakelijk#939 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… blijvend Uit de tweede review van #164. De herstelrem werkte niet over de stroom. Een geslaagde lijst-tik zette hem terug, en over de stroom komt die tik meteen na een herstelronde, als de sessie net gevuld is. Een sessie die korter leeft dan één cyclus draaide zo om de paar seconden een ronde langs alle organisaties, zonder einde. Over de stroom zet nu de eerste hartslag de rem terug, samen met de andere tellers. Een bericht uit de stroom dat we moesten overslaan, bleef weg tot de volgende `volgen-gestart`, en die kan een uur op zich laten wachten. Nu volgt na vijf seconden een lijst-tik, die het alsnog brengt of, zonder id, meldt. Een bericht zonder id werd niet gemeld als er tijdens de tik een bericht uit de stroom bijkwam: de telling liep ná het samenvoegen. Ook niet als het de enige wijziging was, want de vergelijking met de vorige lijst kwam eerst. Nu wordt het gemeld zodra het aantal verandert. De waakhond herstart op een gebeurtenis die we konden lezen, niet op elk binnenkomend blok. Een stroom met alleen onleesbare frames bleef anders een uur open en telde nooit als mislukt. Drie mislukte verbindingen binnen een paar seconden — een wifi-wissel — zetten de pagina voorgoed op navragen. Die terugval is nu tijdelijk: na vijf minuten, of bij `pageshow`, probeert de berichtenbox de stroom opnieuw. Blijvend is hij alleen bij een keten zonder `_volgen` en bij een 409 die na een ronde terugkomt. De terugval staat in de console als waarschuwing, niet als info. Verder: `Retry-After` wacht hoogstens een minuut, de body van een 200 zonder stroom wordt gesloten (elke open verbinding telt mee voor de vijf per ontvanger), en een onbekende soort melding komt één keer in de console. Tests voor elk punt, eerst rood; ook voor het terugzetten van de tellers bij de eerste hartslag, en één test die een bericht van de stroom tot een binnenkomer in de bron volgt. Elke fix weghalen laat een test vallen. Helpt MinBZK/MijnOverheidZakelijk#939 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ericwout-overheid
changed the base branch from
fix/afzendernaam-alsnog-naar-main
to
main
September 22, 2026 15:51
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Helpt MinBZK/MijnOverheidZakelijk#939. Niet
Closes: het issue sluit pas als beide kanten klaar zijn. Deze PR is de proeftuin-kant; het endpoint komt uit MinBZK/moza-poc-fbs-berichtenbox#336.Wat de bezoeker merkt
Een bericht dat binnenkomt terwijl de berichtenbox openstaat, staat er binnen enkele seconden, zonder verversen en zonder ophaalronde langs de organisaties. In de netwerktab staan geen periodieke
GET /api/v1/berichtenmeer.Hoe
assets/javascript/berichtenbox-keten.jsopent na een geslaagde rondeGET /api/v1/berichten/_volgen, metfetchen een reader.EventSourcekan geenX-Ontvangermeesturen. De SSE-parser van_ophalenisleesSsegeworden en wordt door beide gedeeld.volgen-gestartpollTik. Liep er al een tik, dan volgt er nog één. Mislukt die tik, dan blijft de stroom open en volgt na 15 s een nieuwe poging; na drie op rij stopt het bijwerken met de bestaande mededeling.bericht-bijgekomennaarBerichtenboxVormen bovenaan de lijst. Ontdubbeld opberichtId. De bron maakt er een{ nieuwBericht }van (bestaande weg).hartslageventconsole.warnper soort.console.error; de verbinding blijft staan. Na 5 s een lijst-tik, die het bericht alsnog brengt of (zonder id) meldt.sessie-verlopenherstelSessie, met dezelfde rem van twee rondes, en daarna opnieuw verbinden.herstelSessie. Komt er vóór een gezonde verbinding wéér een 409, dan blijvend terug naar navragen.Retry-Afterafwachten, hoogstens een minuut.text/event-streampageshowde stroom opnieuw proberen, met de reeks tussenpozen waar die was. Geen melding.Twee randgevallen:
bijgekomenTijdensTik). Anders legt de oudere lijst zich eroverheen, ziet de bron het bericht "verdwijnen" en haalt die het weer weg._volgen) leest het pad alsGET /berichten/{berichtId}. MetAccept: text/event-streamgeeft die een 406, geen 404. Gemeten met curl. Zonder deze uitzondering zou de client daar pas na drie mislukte pogingen terugvallen.Levenscyclus.
pagehidesluit de stroom enpageshowverbindt opnieuw. Is er intussen een andere persona gekozen, dan stopt de pagina met volgen, want anders haalt die de post van iemand anders op. Een verborgen tabblad blijft verbonden.stopPollen()sluit de stroom ook.Instelling.
?volgen=0ofsetting:berichtenbox-volgenop0zet de stroom uit.?poll=blijft werken voor de terugval.Proxy. Niets veranderd.
container/default.conf.templatestaat al ongebufferd met eenproxy_read_timeoutvan 3600 s, en lokaal loopt/api/v1/viaserver/keten-proxy.js, dat ook al een timeout van 3600 s heeft.Tests
Nieuw bestand
tests/berichtenbox/keten-volgen.test.js, met 48 tests op een nagebootsteReadableStream:volgen-gestart→ lijst-tik →bericht-bijgekomen, en daarna geen periodieke tikken;tikNogEens;sessie-verlopen→ herstel, een 409 bij openen, een 409 die na een ronde terugkomt, en een 409 van de lijst terwijl de stroom openstaat;Retry-After;pagehide/pageshow, een verborgen tabblad (ook terug naar zichtbaar), een persona-wissel enstopPollen();?volgen=0en de localStorage-instelling;sessie-verlopenmeldt;Retry-Aftermet een bovengrens, de tijdelijke terugval en zijn herkansing, en het sluiten van een body die we niet lezen;ketenBrontot{ nieuwBericht }, inclusief het grensvlak.Nagelopen met mutaties, na elke reviewronde opnieuw: elke fix en elk kernpad weghalen laat minstens één test falen. Twee tests (
pagehideenstopPollen()) slaagden eerst ook zonder dat de stroom dichtging, omdat de waakhond hem binnen hun wachttijd toch afbrak. Die kijken nu meteen.Het harnas geeft op
_volgenstandaard een 404, zoals een keten zonder dat endpoint. Daarmee toetsen de bestaande polltests precies de terugval.npm test: 516 geslaagd, 1 mislukt. Die ene isdetail.test.js› "noemt de knop Terugzetten in inbox…". Die faalt opmainal en hangt niet samen met deze PR.Nog niet gedaan
Nog niet uitgeprobeerd tegen een keten die
_volgenecht levert: lokaal de demo-stack vanfeature/939-nieuwe-berichten-live, of de preview van moza-poc-fbs-berichtenbox#336. De stappen uit de opdracht:BACKEND_KETEN).proeftuin-eenen voer via het bedieningspaneel een bericht op. Dat hoort binnen enkele seconden te verschijnen, zonder periodieke lijstaanroepen in de netwerktab.Daarom is deze PR een draft.
🤖 Generated with Claude Code