Changeset f889429 in Klonkt


Ignore:
Timestamp:
08/07/2026 10:57:55 AM (5 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
ea138c0
Parents:
31e63d1
git-author:
Robin <roboburr@…> (08/07/2026 10:57:53 AM)
git-committer:
roboburr <roboburr@…> (08/07/2026 10:57:55 AM)
Message:

Stilte kost nu niets: 304 als er niets veranderd is (shaer-n05)

Barts punt, en het legt een echte fout in mijn ontwerp bloot. De wachtende
inbox-lezing stuurde bij elke afloop van de wachttijd de VOLLEDIGE collectie
terug -- elke 25 seconden een tijdlijn over de mobiele verbinding om te zeggen
dat er niets gebeurd is. Dat is een slecht ruilmiddel voor het uitsparen van een
rondje.

Nu: 304 zonder body als de merksteen niet bewoog, de volle collectie als hij dat
wel deed. Daarmee is dit beter dan allebei de ontwerpen die op tafel lagen --
een apart seintje-endpoint kost bij nieuws twee rondjes, dit een.

DE '0'-UITZONDERING IS GEEN FRANJE. Ontbreekt ap_feed_state, dan geeft feedCursor
altijd '0' en zou een client hier eeuwig 304 krijgen en nooit meer inhoud zien.
Bij een lege merksteen gaat de collectie dus gewoon mee: trager, nooit fout.

Aan de clientkant moest de 304-tak VOOR de foutcontrole, anders telt stilte als
een storing en duwt hij de wachtlus in zijn oplopende pauze. En caps worden bij
een 304 NIET overschreven: een leeg antwoord draagt geen rechten, en die
klakkeloos overnemen zou de gated rechten terugzetten naar "alles mag". Vandaar
dat het antwoord nu expliciet changed draagt in plaats van dat de beller het uit
de cursor moet afleiden.

Suite 544/544.

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • docs/shaer-c2s-api.md

    r31e63d1 rf889429  
    9696- Send neither and the route behaves exactly as it always did.
    9797
    98 The answer arrives as soon as anything the inbox would show has changed, or when
    99 `wait` runs out — whichever comes first. Either way it is the full, current
    100 collection with a fresh `shaer:cursor`. An empty-handed return is not an error:
    101 it means nothing happened, ask again.
     98Two possible answers:
     99
     100| | |
     101|---|---|
     102| **`200`** | something changed. The full, current collection with a fresh `shaer:cursor`. |
     103| **`304`** | nothing changed within `wait`. **No body.** Keep the cursor you have and ask again. |
     104
     105`304` is not an error — it is the normal answer to a quiet minute, and it is why
     106this costs nothing while nothing happens. Sending the whole timeline back every
     107`wait` seconds just to say "still nothing" would be a poor trade for saving one
     108round trip.
     109
     110A server that has not run the feed-state migration yet cannot tell change from
     111stillness, and answers `200` with the collection every time rather than `304`
     112forever. Slower, never wrong.
    102113
    103114The cursor moves for **all four** sources this read merges: the timeline,
  • src/routes/activitypub.js

    r31e63d1 rf889429  
    285285    const afbreken = new AbortController();
    286286    res.on('close', () => afbreken.abort());   // client hing op: niet doorgaan met wachten
    287     await AP.waitForFeedChange(auth.site.slug, {
     287    const uit = await AP.waitForFeedChange(auth.site.slug, {
    288288      since: String(req.query.since), waitMs: wachtS * 1000, signal: afbreken.signal,
    289289    });
    290290    if (res.writableEnded || afbreken.signal.aborted) return undefined;
     291    // Niets veranderd? Dan een LEEG antwoord (Barts punt): de hele collectie
     292    // terugsturen terwijl er niets gebeurd is, is elke 25 seconden een tijdlijn
     293    // over de mobiele verbinding voor niets. Met 304 kost stilte niets en kost
     294    // nieuws nog steeds maar één rondje -- beter dan een apart seintje-endpoint,
     295    // dat voor nieuws twee rondjes nodig heeft.
     296    //
     297    // De '0'-uitzondering is geen franje. Ontbreekt ap_feed_state (een instance
     298    // die de migratie nog niet draaide), dan geeft feedCursor altijd '0' terug,
     299    // en zou een client hier eeuwig 304 krijgen en nooit meer inhoud zien. Bij
     300    // een lege merksteen sturen we dus gewoon de collectie.
     301    if (!uit.changed && uit.cursor !== '0') {
     302      res.set('Vary', 'Authorization');
     303      return res.status(304).end();
     304    }
    291305  }
    292306  // Gated feature (FEP-633c): may this account see EXTERNAL embeds? A ward's
Note: See TracChangeset for help on using the changeset viewer.