Changeset cb3001e in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
08/11/2026 06:26:59 PM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
aed0092
Parents:
fc41e04
Message:

De outbox pagineert, want zonder first en last weigerde Funkwhale hem

De eerste CONCRETE reden die we hoorden waarom er niets van ons binnenkwam. Uit
hun log:

Error while fetching actor outbox: https://dev.klonkt.com/ap/users/dev/outbox
ValidationError: {'first': This field is required.,

'last': This field is required.}

AS2 eist die velden niet -- een OrderedCollection mag zijn items inline dragen,
en dat deden wij -- maar bijna iedereen pagineert, en een lezer die de
paginaweg volgt liep hier dood. Dagenlang zochten we het bij onze objecten
terwijl het de omslag was.

De items blijven WEL inline op de wortel. Shaer bouwt zijn feed daaruit, en wie
hem vandaag leest hoort er morgen niet voor te hoeven pagineren. Er is precies
een pagina (we kappen op MAX_OUTBOX), dus first en last wijzen naar dezelfde, en
?page=1 geeft een OrderedCollectionPage met partOf terug.

Ook de LEGE outbox van een geblokkeerde lezer draagt ze nu -- juist die zou
anders door dezelfde serializer geweigerd worden, en dan is een blokkade van
buiten niet te onderscheiden van een kapotte server.

Vijf tests. Anker bij het bewerken was .slice(0, MAX_OUTBOX): het retourblok van
buildOutbox is teken voor teken gelijk aan dat van buildFeatured, en een
patroon zonder dat anker raakte er twee.

NIET meegenomen: followers, following en featured missen first/last ook. Daar
klaagde niemand over en Mastodon leest ze zonder morren, dus dat is een aparte
afweging en geen sleepnet.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    rfc41e04 rcb3001e  
    182182  });
    183183  if (audience === 'blocked') {
    184     return AP.sendAP(res, AP.buildOutbox(baseUrl(req), site, []), 'private, no-store');
     184    return AP.sendAP(res, AP.buildOutbox(baseUrl(req), site, [], [], { page: !!req.query.page }), 'private, no-store');
    185185  }
    186186  const fanClause = audience === 'friend' ? '' : "AND (fan_only IS NULL OR fan_only = 0)";
     
    192192  // De tracks gaan mee voor iedereen die de deur door mag; de blocked-tak
    193193  // hierboven levert bewust een outbox ZONDER posts en zonder tracks.
    194   const ob = AP.buildOutbox(baseUrl(req), site, posts, AP.siteOpenTracks(site.id));
     194  const ob = AP.buildOutbox(baseUrl(req), site, posts, AP.siteOpenTracks(site.id), { page: !!req.query.page });
    195195  if (audience === 'friend') {
    196196    // The owner's app builds its feed from this leg, and every note here is
Note: See TracChangeset for help on using the changeset viewer.