FEP-044f: Klonkt resolvet de geciteerde post voor een ingebedde quote-kaart
De client kan remote AP-objecten niet gesigneerd ophalen, dus Klonkt resolvet de
quote emit-side tot een compacte, gesaneerde snapshot en serveert die als
shaer:quote op de C2S inbox-read. De client rendert daarmee een geneste kaart
(auteur + avatar + tekst + evt. thumbnail) i.p.v. alleen de link-chip.
resolveQuote(note) haalt de quoted post op (SSRF-safe apGetJson), pakt de auteur
(fetchActor + actorInfo) en saneert de content met dezelfde sanitizer als elke
andere note (kindveilig blijft gelden). Best-effort: faalt de fetch, dan blijft
quote_json leeg en valt de client terug op de chip.
Bron-URL via quoteHrefOf: object-level quote (FEP-044f) of een quote-rel
FEP-e232 Link. Resolutie op inbound (fire-and-forget, blokkeert de inbox-response
niet), op outbox-backfill (await) en in self-heal (v10 -> v11, met COALESCE-gedrag
zodat een tijdelijk onbereikbare quoted post de cache niet leegt).
Changed files:
src/config/database.js
- ap_timeline.quote_json kolom
src/services/ActivityPubService.js
- quoteHrefOf(note): quoted-post-URL uit object-quote of quote-rel Link
- resolveQuote(note): async snapshot {url, author, content, published, media}
- timelineQuote(quoteJson): snapshot terug voor de inbox-read
- inbound (fire-and-forget), backfill (await), self-heal v11 (await + COALESCE)
- timelineQuote in de default-export
src/routes/activitypub.js
- inbox-read serveert shaer:quote (de geresolvede snapshot)
test/object-links.test.js
- quoteHrefOf (object-quote + quote-rel Link + geen) en timelineQuote round-trip
remarks: 180 tests groen (was 178). resolveQuote zelf is netwerk, niet in de unit-test.
-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>