Changeset e4119c2 in Klonkt for src/routes
- Timestamp:
- 10/29/2026 05:35:25 PM (4 hours ago)
- Branches:
- main
- Children:
- 3155d8c
- Parents:
- 7ccdced
- File:
-
- 1 edited
-
src/routes/activitypub.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
r7ccdced re4119c2 965 965 }, 'private, no-store'); 966 966 } 967 // ── Ouder dan wat je hebt (shaer-ewrt) ────────────────────────── 968 // 969 // De volle lezing hieronder is vier poten van de nieuwste zestig, en wat 970 // daaronder lag was nergens te vragen: een 'load more' had geen adres. Dit is 971 // dat adres, met een samengestelde cursor zoals bij /messages, en het antwoord 972 // is een OrderedCollectionPage met partOf -- een deel, en dat zegt het ook. 973 // 974 // De pagina's volgen elkaar via `next`; de client bouwt er geen na. 975 const inboxId = `${base}/ap/users/${auth.site.slug}/inbox`; 976 const size = req.query.limit ? `&limit=${encodeURIComponent(String(req.query.limit))}` : ''; 977 const ouderLink = (pagina) => (pagina.more && pagina.oldest 978 ? `${inboxId}?before=${encodeURIComponent(pagina.oldest)}${size}` : undefined); 979 if (req.query.before) { 980 const pagina = AP.inboxPage(auth.site.slug, { before: String(req.query.before), limit: req.query.limit }); 981 const ids = (leg) => pagina.rows.filter((r) => r.leg === leg).map((r) => r.ref); 982 const tl = new Map(AP.timelineRowsByIds(auth.site.slug, ids('timeline')).map((r) => [r.id, r])); 983 const mn = new Map(AP.messageRowsByUri(auth.site.slug, ids('message')).map((r) => [r.object_uri, r])); 984 const rp = new Map(AP.replyRowsByUri(auth.site.slug, ids('reply')).map((r) => [r.object_uri, r])); 985 const reacties = AP.getReactionsFor(auth.site.slug, [...tl.keys()]); 986 const ctx = { base, me, myHandle, p: P }; 987 const mine = AP.selfAuthor(base, auth.site); 988 const items = []; 989 for (const r of pagina.rows) { 990 if (r.leg === 'timeline') { 991 const t = tl.get(r.ref); 992 if (t) items.push(timelineItem(t, { p: P, reactions: reacties })); 993 } else if (r.leg === 'message') { 994 // Dezelfde poort als de volle lezing: een dichte berichtenpoort houdt 995 // vreemden buiten, nooit de hulpvraag en nooit de guardians. 996 const m = mn.get(r.ref); 997 if (m && (messagesAllowed || m.help_request || guardianUris.has(m.actor_uri))) items.push(messageItem(m, ctx)); 998 } else if (r.leg === 'reply') { 999 const m = rp.get(r.ref); 1000 if (m) items.push(replyItem(m, ctx)); 1001 } else { 1002 const n = AP.getOutboxNote(base, r.ref); 1003 if (n) items.push(sentItem(n, { me, mine })); 1004 } 1005 } 1006 return AP.sendAP(res, { 1007 '@context': AP.AP_CONTEXT, 1008 id: `${inboxId}?before=${encodeURIComponent(String(req.query.before))}${size}`, 1009 type: 'OrderedCollectionPage', 1010 partOf: inboxId, 1011 orderedItems: items, 1012 // Ontbreekt next, dan is de inbox op. De client hoort dat te weten zonder 1013 // te gokken, anders kan zijn knop niet eerlijk verdwijnen. 1014 next: ouderLink(pagina), 1015 }, 'private, no-store'); 1016 } 967 1017 const rows = AP.getTimeline(auth.site.slug, 60); 968 1018 // Eén query voor de hele pagina (shaer-9e9 fase 2): shaer:liked komt uit de … … 1021 1071 totalItems: items.length, 1022 1072 orderedItems: items, 1073 // Waar het oudere begint (shaer-ewrt). Een `next` op de wortel en geen 1074 // `first`, en dat is een afweging: de items hierboven ZIJN de eerste 1075 // pagina, en een `first` ernaast laat een lezer die de paginaweg voorrang 1076 // geeft -- de onze, op iOS en op Android -- bij elke verversing de hele 1077 // inbox opnieuw in pagina's binnenhalen. `next` volgt niemand vanzelf; hij 1078 // is er voor wie erom vraagt. 1079 // 1080 // De cursor komt uit dezelfde unie als de pagina's, over de nieuwste zestig 1081 // van alle poten samen. Die zitten hier allemaal tussen, dus de volgende 1082 // pagina sluit aan zonder gat; wat de wortel per poot dieper had komt daar 1083 // hooguit nog een keer langs. 1084 next: ouderLink(AP.inboxPage(auth.site.slug, { limit: req.query.limit || 60 })), 1023 1085 }); 1024 1086 return undefined;
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)