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/services/ActivityPubService.js

    rfc41e04 rcb3001e  
    10191019 * zijn eigen database bevraagt zou dwars door die deur heen leveren.
    10201020 */
    1021 export function buildOutbox(base, site, posts, tracks = []) {
     1021export function buildOutbox(base, site, posts, tracks = [], { page = false } = {}) {
    10221022  const id = `${actorId(base, site.slug)}/outbox`;
    10231023  const wanneer = (x) => Date.parse(x && x.published ? x.published : 0) || 0;
     
    10321032    .sort((a, b) => wanneer(b) - wanneer(a))
    10331033    .slice(0, MAX_OUTBOX);
     1034  // GEPAGINEERD, ook al past alles op een pagina (Funkwhale, 11-8).
     1035  //
     1036  // Hun serializer weigerde onze outbox met "first: This field is required" en
     1037  // "last: This field is required". AS2 EIST ze niet -- een collectie mag zijn
     1038  // items inline dragen -- maar bijna iedereen pagineert, en een lezer die de
     1039  // paginaweg volgt liep hier dood. Dit is de eerste concrete reden die we
     1040  // hoorden waarom er niets van ons binnenkwam.
     1041  //
     1042  // De items blijven WEL inline op de wortel. Shaer bouwt zijn feed daaruit, en
     1043  // wie hem vandaag leest hoort er morgen niet voor te hoeven pagineren. Er is
     1044  // precies een pagina, dus first en last wijzen naar dezelfde.
     1045  const eerste = `${id}?page=1`;
     1046  if (page) {
     1047    return {
     1048      '@context': AP_CONTEXT,
     1049      id: eerste,
     1050      type: 'OrderedCollectionPage',
     1051      partOf: id,
     1052      totalItems: items.length,
     1053      orderedItems: items,
     1054    };
     1055  }
    10341056  return {
    10351057    '@context': AP_CONTEXT,
     
    10371059    type: 'OrderedCollection',
    10381060    totalItems: items.length,
     1061    first: eerste,
     1062    last: eerste,
    10391063    orderedItems: items,
    10401064  };
Note: See TracChangeset for help on using the changeset viewer.