Changeset e667d26 in Klonkt for test/guardian-help-state.test.js


Ignore:
Timestamp:
08/09/2026 07:28:31 AM (4 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
c832064
Parents:
82c3356
git-author:
Robin <roboburr@…> (08/09/2026 07:28:29 AM)
git-committer:
roboburr <roboburr@…> (08/09/2026 07:28:31 AM)
Message:

Een levende klok in het antwoord maakte de lange poll een lus (9-8)

Barts melding: de browser komt in een feedback-lus van ongeveer een seconde, en
de scrollpositie wordt vermalen. Dat is mijn fout van een uur eerder, en de
oorzaak is scherper dan hij lijkt.

Het paneel kreeg gisteren een inhouds-ETag, en de paneelstate bevat -- bevatte --
ageMs: de leeftijd van de oudste oppik, uitgerekend als now - tijdstip.
Daardoor verschilde elk antwoord een paar milliseconden van het vorige, kon de
ETag nooit gelijk zijn, kwam de 304 nooit, keerde de lange poll meteen terug, en
tekende het paneel zich stuk terwijl Bart scrollde.

EEN LEVENDE KLOK MAAKT EEN ANTWOORD ONVERGELIJKBAAR MET ZICHZELF. Dat is de les,
en hij raakt elk veld dat we ooit nog toevoegen. Er staat nu een toets op die
hetzelfde antwoord twee keer opvraagt met een halve seconde ertussen en eist dat
het identiek is.

De reparatie zit bij de BRON, niet in de ETag: het antwoord draagt nu het
TIJDSTIP (oldestPickupAt) en de client rekent de leeftijd uit. Dat is ook wat het
altijd al was -- een weergavedetail. De ETag uitzonderingen laten maken zou een
tweede beschrijving zijn van "wat telt als veranderd", precies wat ik gisteren
als argument tegen een cursor gebruikte.

TWEE GRENDELS ERBIJ, aan de kant die de gebruiker merkt:

  • Zelfde inhoud wordt niet hertekend. De 304 hoort dit af te vangen, maar een enkel onstabiel veld zette het scherm aan het knipperen; dit vangt de volgende.
  • Een lange poll die binnen twee seconden terugkeert wacht drie seconden voordat hij opnieuw vraagt. Een poll die niet wacht mag nooit een lus worden -- anders vervangt een defect een tik per 45 seconden door duizend per minuut.

En de scrollpositie overleeft een verversing: meten en terugzetten rond
renderAll. Dat is het verschil tussen een scherm dat bijwerkt en een scherm dat
onder je handen wegschuift.

Suite 782/782; met de klok terug valt hij om.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/guardian-help-state.test.js

    r82c3356 re667d26  
    6363  const s = help.helpStatus(rijen, Date.parse('2026-08-07T10:00:00.000Z'));
    6464  assert.equal(s.open, true);
    65   assert.equal(s.ageMs, 2 * 24 * 3600 * 1000, 'twee dagen oud, en dat hoort te zien te zijn');
     65  // Een TIJDSTIP, geen leeftijd: een verschil met `now` maakt het antwoord elke
     66  // milliseconde anders, en dan kan de ETag van het paneel nooit gelijk zijn --
     67  // dat leverde een lus op waarin de browser zichzelf bleef verversen.
     68  assert.equal(s.oldestPickupAt, '2026-08-05T10:00:00.000Z');
    6669});
    6770
     
    7174  assert.equal(s.open, false);
    7275  assert.equal(s.handled.handle, '@opa@opa.test');
    73   assert.equal(s.ageMs, null, 'de leeftijd van een oppik zegt niets meer als het klaar is');
     76  assert.equal(s.oldestPickupAt, null, 'het tijdstip van een oppik zegt niets meer als het klaar is');
    7477});
    7578
     
    146149  assert.deepEqual(help.withWardship(basis, true), basis);
    147150});
     151
     152test('het antwoord verandert NIET als je het twee keer opvraagt', () => {
     153  // De fout die Barts browser in een lus bracht (9-8): hier stond ageMs, een
     154  // verschil met `now`. Daardoor was elk antwoord anders, kon de ETag van het
     155  // paneel nooit gelijk zijn, kwam de 304 nooit, en keerde de lange poll meteen
     156  // terug -- inclusief een hertekening die de scrollpositie vermaalde.
     157  //
     158  // Een levende klok in een antwoord maakt dat antwoord onvergelijkbaar met
     159  // zichzelf. Deze toets bewaakt precies dat.
     160  const rijen = [{ kind: 'pickup', guardian_uri: OMA, created_at: '2026-08-05T10:00:00.000Z' }];
     161  const a = JSON.stringify(help.helpStatus(rijen, Date.parse('2026-08-05T12:00:00.000Z')));
     162  const b = JSON.stringify(help.helpStatus(rijen, Date.parse('2026-08-05T12:00:00.500Z')));
     163  assert.equal(a, b, 'een halve seconde later is hetzelfde antwoord');
     164});
Note: See TracChangeset for help on using the changeset viewer.