Changeset 4838760 in Klonkt for src/routes/activitypub.js
- Timestamp:
- 08/08/2026 05:23:46 PM (4 weeks ago)
- Branches:
- main
- Children:
- d1075a1
- Parents:
- abcf51a
- File:
-
- 1 edited
-
src/routes/activitypub.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/routes/activitypub.js
rabcf51a r4838760 191 191 // entries carry, so your own cards get a header too (avatar + name). 192 192 const me = AP.selfAuthor(baseUrl(req), site); 193 // De kaart op je eigen post (shaer-k3f): dezelfde shaer:quote/shaer:embed 194 // die de tijdlijn voor andermans posts draagt, uit de snapshots die 195 // deliverCreate bij het publiceren opsloeg. Op note-id gekoppeld, want 196 // buildOutbox sorteert en mengt tracks erdoorheen. De embed alleen voor de 197 // BEARER en langs zijn eigen poort: een remote vriend krijgt hem niet 198 // (diens server resolvet en gate zelf bij ontvangst), en een ward zonder 199 // open embeds-poort krijgt hem hier net zo min als in de tijdlijn. 200 const byNote = new Map(posts.map((p) => [AP.noteId(baseUrl(req), p.id), p])); 201 const bearerEmbeds = bearer ? (() => { 202 const isWard = (() => { try { return Guardianship.listGuardians(bearer.site.slug).length > 0; } catch { return false; } })(); 203 return Guardianship.externalEmbedsAllowed(bearer.site.external_embeds, isWard) 204 ? { playback: Guardianship.externalPlaybackAllowed(bearer.site.external_playback, isWard) } : null; 205 })() : null; 193 206 for (const it of ob.orderedItems) { 194 if (it && it.object && typeof it.object === 'object') it.object['shaer:author'] = me; 207 if (it && it.object && typeof it.object === 'object') { 208 it.object['shaer:author'] = me; 209 const row = byNote.get(it.object.id); 210 if (row) { 211 it.object['shaer:quote'] = AP.timelineQuote(row.quote_json); 212 if (bearerEmbeds) it.object['shaer:embed'] = AP.timelineEmbed(row.embed_json, { playback: bearerEmbeds.playback }); 213 } 214 } 195 215 } 196 216 } … … 813 833 814 834 // ── Replies collection ── lets remote servers fetch a post's whole thread. 835 // ── De composer-preview (shaer-k3f): een URL wordt alvast een kaart ── 836 // 837 // Bearer-only, net als de thread: dit is de eigen app die tijdens het typen 838 // vraagt wat een link gaat worden. Dezelfde pijplijn als publiceren, dus de 839 // preview kan niet iets beloven dat de post niet waarmaakt. De embed gaat 840 // langs de eigen poort van de lezer -- een ward zonder open embeds-poort 841 // krijgt in de composer geen kaart die zijn feed hem ook niet zou tonen. 842 router.get('/ap/users/:slug/card', async (req, res) => { 843 const auth = OAuth.verifyBearer(req.headers.authorization); 844 if (!auth || auth.site.slug !== req.params.slug) return res.status(403).end(); 845 const uit = await AP.previewCard(String(req.query.url || '')); 846 const isWard = (() => { try { return Guardianship.listGuardians(auth.site.slug).length > 0; } catch { return false; } })(); 847 const embedsAllowed = Guardianship.externalEmbedsAllowed(auth.site.external_embeds, isWard); 848 const playback = embedsAllowed && Guardianship.externalPlaybackAllowed(auth.site.external_playback, isWard); 849 AP.sendAP(res, { 850 '@context': AP.AP_CONTEXT, 851 'shaer:quote': AP.timelineQuote(uit.quoteJson), 852 'shaer:embed': embedsAllowed ? AP.timelineEmbed(uit.embedJson, { playback }) : undefined, 853 }, 'private, no-store'); 854 }); 855 815 856 // ── De thread onder een post (shaer-tqz): ophalen, niet bewaren ──── 816 857 //
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)