Changeset c4b24b3 in Klonkt


Ignore:
Timestamp:
08/08/2026 01:08:33 AM (5 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
9c9a3d9
Parents:
4f97b70
Message:

De thread van een vreemde post: ook de next-pagina lezen

Barts verduidelijking (8-8) wees de fout aan: het ging om reacties op een
VREEMDE post, niet een eigen. Mijn Waydroid-test draaide op een eigen
post, en die gaat door de lokale kortsluiting -- orderedItems meteen vol,
niets te wandelen. Vandaar dat de fout niet opviel.

Mastodon serveert de replies-collectie met een first die een INLINE
pagina is met lege items en een next waar de antwoorden echt staan.
Wie alleen de eerste pagina leest ziet op elke Mastodon-post een leeg
gesprek. getThread wandelt nu tot drie pagina's, met behoud van inline
objecten (die hoeven niet opnieuw opgehaald) -- dezelfde kneep die
collectReplyItems voor de eigen-post-crawler al kende.

Test erbij die de Mastodon-vorm exact nabootst; alle 624 groen.

Co-Authored-By: Claude Opus 5 <noreply@…>

Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r4f97b70 rc4b24b3  
    34073407      : (repliesRef.id ? await signedGetJson(slug, repliesRef.id) : repliesRef);
    34083408  }
    3409   // ÉÉN pagina, met opzet: de eerste. Wie meer wil moet eerst kunnen zeggen
    3410   // waarom dertig directe antwoorden niet genoeg context is voor een gesprek.
    3411   let items = collectionItems(coll);
    3412   if (!items.length && coll && coll.first) {
    3413     const first = typeof coll.first === 'string' ? await signedGetJson(slug, coll.first) : coll.first;
    3414     items = collectionItems(first);
     3409  // De pagina-wandeling van collectReplyItems, maar met behoud van INLINE
     3410  // objecten (die niet opnieuw opgehaald hoeven). Niet "de eerste pagina":
     3411  // Mastodon serveert `first` als inline-pagina met LEGE items en een `next`
     3412  // waar de antwoorden echt staan -- wie alleen de eerste pagina leest, ziet
     3413  // op elke Mastodon-post een leeg gesprek. Dat was precies Barts melding
     3414  // (8-8, reacties op een vreemde post). Eigen posts maskeerden het: die
     3415  // gaan door de lokale kortsluiting en hebben orderedItems meteen vol.
     3416  let items = [];
     3417  let node = coll;
     3418  if (node && node.first && !collectionItems(node).length) {
     3419    node = typeof node.first === 'string' ? await signedGetJson(slug, node.first) : node.first;
     3420  }
     3421  let pages = 0;
     3422  while (node && pages++ < 3 && items.length < THREAD_VIEW_LIMIT) {
     3423    items.push(...collectionItems(node));
     3424    if (!node.next) break;
     3425    node = typeof node.next === 'string' ? await signedGetJson(slug, node.next) : node.next;
    34153426  }
    34163427  items = items.slice(0, THREAD_VIEW_LIMIT);
  • test/thread.test.js

    r4f97b70 rc4b24b3  
    9191});
    9292
     93test('de Mastodon-vorm: first is een lege inline-pagina, de antwoorden staan op next', async () => {
     94  // Precies wat Mastodon serveert en wat Barts melding (8-8) verklaarde: wie
     95  // alleen de eerste pagina leest, ziet op elke Mastodon-post een leeg gesprek.
     96  const MPOST = 'https://203.0.113.50/notes/masto-1';
     97  const vorige = globalThis.fetch;
     98  globalThis.fetch = async (url) => {
     99    const u = String(url);
     100    const json = (o) => new Response(JSON.stringify(o), { status: 200, headers: { 'content-type': 'application/activity+json' } });
     101    if (u === MPOST) return json({
     102      id: MPOST, type: 'Note', attributedTo: TANTE, content: '<p>toot</p>',
     103      replies: {
     104        id: `${MPOST}/replies`, type: 'Collection',
     105        first: { type: 'CollectionPage', items: [], next: `${MPOST}/replies?page=true` },
     106      },
     107    });
     108    if (u === `${MPOST}/replies?page=true`) return json({
     109      type: 'CollectionPage',
     110      items: [{ id: `${MPOST}/r1`, type: 'Note', attributedTo: TANTE, inReplyTo: MPOST, content: '<p>eerste echte antwoord</p>', published: '2026-08-02T10:00:00Z' }],
     111    });
     112    return vorige(url);
     113  };
     114  const uit = await AP.getThread('kind', MPOST, { isWard: false });
     115  globalThis.fetch = vorige;
     116  assert.equal(uit.notes.length, 1, 'het antwoord op de next-pagina is gevonden');
     117  assert.ok(uit.notes[0].content.includes('eerste echte antwoord'));
     118});
     119
    93120test('de tweede lezing komt uit het geheugen, niet van het netwerk', async () => {
    94121  let calls = 0;
Note: See TracChangeset for help on using the changeset viewer.