Changeset 3bbf73d in Klonkt for src/routes/activitypub.js
- Timestamp:
- 08/10/2026 02:43:16 PM (4 weeks ago)
- Branches:
- main
- Children:
- f0a33e1
- Parents:
- f549cf5
- File:
-
- 1 edited
-
src/routes/activitypub.js (modified) (9 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
rf549cf5 r3bbf73d 289 289 // dat evenveel kopieen worden -- en een poort die op een van die plekken 290 290 // vergeten wordt, levert stil iets uit dat dicht hoorde te staan. 291 function leesPoorten(site) {291 function gatesFor(site) { 292 292 const isWard = (() => { try { return Guardianship.listGuardians(site.slug).length > 0; } catch { return false; } })(); 293 293 const embeds = Guardianship.externalEmbedsAllowed(site.external_embeds, isWard); … … 314 314 315 315 /** De naam waaronder deze lezer zichzelf herkent in een Mention. */ 316 function eigenHandle(base, slug) {316 function ownHandle(base, slug) { 317 317 try { return `@${slug}@${new URL(base).host}`; } catch { return `@${slug}`; } 318 318 } … … 323 323 // opschrijven is twee vormen die uit de pas kunnen lopen, en dat merk je pas 324 324 // als een kaart ergens anders rendert dan waar je keek. 325 function berichtItem(m, { base, me, myHandle, p }) {325 function messageItem(m, { base, me, myHandle, p }) { 326 326 return { 327 327 id: `${m.object_uri}#create`, … … 359 359 360 360 /** Een eigen verzonden note als AS2-item, zelfde vorm als de inbox-leg. */ 361 function verzondenItem(n, { me, mine }) {361 function sentItem(n, { me, mine }) { 362 362 return { 363 363 id: `${n.id}#create`, … … 383 383 // ophoudt. 384 384 // 385 // Beide lopen langs dezelfde poorten als de inbox-lezing ( leesPoorten) en386 // dezelfde kaartvorm ( berichtItem/verzondenItem). Messages dicht sluit ook385 // Beide lopen langs dezelfde poorten als de inbox-lezing (gatesFor) en 386 // dezelfde kaartvorm (messageItem/sentItem). Messages dicht sluit ook 387 387 // hier vreemden en vrienden, maar nooit het guardian-kanaal en nooit de boei. 388 function gesprekItems(req, auth, refs) {388 function conversationItems(req, auth, refs) { 389 389 const base = baseUrl(req); 390 const P = leesPoorten(auth.site);390 const P = gatesFor(auth.site); 391 391 const me = AP.actorId(base, auth.site.slug); 392 const ctx = { base, me, myHandle: eigenHandle(base, auth.site.slug), p: P };392 const ctx = { base, me, myHandle: ownHandle(base, auth.site.slug), p: P }; 393 393 const mine = AP.selfAuthor(base, auth.site); 394 394 const guardianUris = (() => { try { return new Set(Guardianship.listGuardians(auth.site.slug).map((g) => g.other_uri)); } catch { return new Set(); } })(); 395 395 396 const binnen = new Map(AP.messageRowsByUri(auth.site.slug, refs.filter((r) => r.richting=== 'in').map((r) => r.ref))396 const incoming = new Map(AP.messageRowsByUri(auth.site.slug, refs.filter((r) => r.direction === 'in').map((r) => r.ref)) 397 397 .map((m) => [m.object_uri, m])); 398 const uit= [];398 const items = []; 399 399 for (const r of refs) { 400 if (r. richting=== 'in') {401 const m = binnen.get(r.ref);400 if (r.direction === 'in') { 401 const m = incoming.get(r.ref); 402 402 if (!m) continue; 403 403 if (!(P.messagesAllowed || m.help_request || guardianUris.has(m.actor_uri))) continue; 404 uit.push(berichtItem(m, ctx));404 items.push(messageItem(m, ctx)); 405 405 } else { 406 406 const n = AP.getOutboxNote(base, r.ref); 407 407 // Je eigen woorden blijven van jou: een dichte messages-poort verbergt 408 408 // niet wat je zelf gezegd hebt. 409 if (n) uit.push(verzondenItem(n, { me, mine }));409 if (n) items.push(sentItem(n, { me, mine })); 410 410 } 411 411 } 412 return uit;412 return items; 413 413 } 414 414 … … 416 416 const auth = OAuth.verifyBearer(req.headers.authorization); 417 417 if (!auth || auth.site.slug !== req.params.slug) return res.status(403).end(); 418 const koppen= AP.conversationHeads(auth.site.slug);419 const items = gesprekItems(req, auth, koppen);418 const heads = AP.conversationHeads(auth.site.slug); 419 const items = conversationItems(req, auth, heads); 420 420 AP.sendAP(res, { 421 421 '@context': AP.AP_CONTEXT, … … 433 433 const other = String(req.query.with || ''); 434 434 if (!/^https?:\/\//i.test(other)) return res.status(400).json({ error: 'with must be an actor URI' }); 435 const uit= AP.conversationHistory(auth.site.slug, other, {435 const page = AP.conversationHistory(auth.site.slug, other, { 436 436 before: req.query.before ? String(req.query.before) : null, 437 437 limit: req.query.limit, 438 438 }); 439 const items = gesprekItems(req, auth, uit.rijen);439 const items = conversationItems(req, auth, page.rows); 440 440 // De paginagrootte reist mee in next: vroeg je om 30, dan hoort de volgende 441 441 // pagina er ook 30 te zijn. Zonder dit wordt hij stilletjes de standaard, en 442 442 // dan klopt het ritme van een 'load more' niet meer met wat de gebruiker ziet. 443 const maat= req.query.limit ? `&limit=${encodeURIComponent(String(req.query.limit))}` : '';444 const zelf = `${baseUrl(req)}/ap/users/${encodeURIComponent(auth.site.slug)}/messages?with=${encodeURIComponent(other)}`;443 const size = req.query.limit ? `&limit=${encodeURIComponent(String(req.query.limit))}` : ''; 444 const self = `${baseUrl(req)}/ap/users/${encodeURIComponent(auth.site.slug)}/messages?with=${encodeURIComponent(other)}`; 445 445 AP.sendAP(res, { 446 446 '@context': AP.AP_CONTEXT, 447 id: req.query.before ? `${ zelf}${maat}&before=${encodeURIComponent(String(req.query.before))}` : `${zelf}${maat}`,447 id: req.query.before ? `${self}${size}&before=${encodeURIComponent(String(req.query.before))}` : `${self}${size}`, 448 448 type: 'OrderedCollectionPage', 449 partOf: zelf,449 partOf: self, 450 450 orderedItems: items, 451 451 // De volgende pagina is de standaardvorm van 'er is meer' (AS2). Ontbreekt 452 452 // hij, dan is het gesprek op -- en dat mag de client weten zonder gokken, 453 453 // want anders kan een 'load more' niet eerlijk verschijnen. 454 next: uit.meer && uit.oudste ? `${zelf}${maat}&before=${encodeURIComponent(uit.oudste)}` : undefined,454 next: page.more && page.oldest ? `${self}${size}&before=${encodeURIComponent(page.oldest)}` : undefined, 455 455 }, 'private, no-store'); 456 456 }); … … 587 587 // here, at serialisation: a blocked embed is never sent, because an embed the 588 588 // client merely hides has still been delivered to the device. 589 // De poorten van deze lezer ( leesPoorten): een plek waar ze berekend worden,589 // De poorten van deze lezer (gatesFor): een plek waar ze berekend worden, 590 590 // zodat de gesprekslezingen dezelfde stand eerbiedigen en niet hun eigen 591 591 // kopie krijgen die kan gaan afwijken. 592 const P = leesPoorten(auth.site);592 const P = gatesFor(auth.site); 593 593 const { 594 594 embedsAllowed, playbackAllowed, imagesAllowed, musicAllowed, quotesAllowed, … … 676 676 // beschermt niemand. De hulpvraag zelf gaat aan de innamekant al altijd voor. 677 677 const guardianUris = (() => { try { return new Set(Guardianship.listGuardians(auth.site.slug).map((g) => g.other_uri)); } catch { return new Set(); } })(); 678 const berichtCtx = { base, me, myHandle, p: P };678 const messageCtx = { base, me, myHandle, p: P }; 679 679 const messages = AP.getDirectMessages(auth.site.slug, 60) 680 680 .filter((m) => messagesAllowed || m.help_request || guardianUris.has(m.actor_uri)) 681 .map((m) => berichtItem(m, berichtCtx));681 .map((m) => messageItem(m, messageCtx)); 682 682 // Inbound REPLIES on your own posts: stored as interactions (the web's 683 683 // comment machinery), never as mentions, so this read missed them and a
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)