Changeset 75f2897 in Klonkt for src/routes/activitypub.js


Ignore:
Timestamp:
08/10/2026 07:33:52 AM (4 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
aae5881
Parents:
0db3c72
Message:

Het dialect eruit waar de standaard het al draagt

shaer-nmw, tweede helft. shaer:author, shaer:booster, shaer:quote en
shaer:embed gaan van alle C2S-legs af: outbox-vriendenleg, tijdlijn,
berichten, antwoorden, eigen verzonden notes, de composer-kaart en de thread.
De standaardvormen uit de vorige commit dragen ze nu alleen.

De thread-leg had de standaardvorm nog niet en kreeg hem hier: de byline van
een antwoord zit in de ingesloten attributedTo, en de emoji-poort knipt in de
tag van die actor in plaats van in een eigen emoji-kaart ernaast.

Twee dingen die stil hadden kunnen breken:

  • filterThreadToCircle vergeleek n.attributedTo als string. Nu dat een object is zou hij ALLES wegfilteren: een ward met een lege thread en nergens een foutmelding. Loopt nu door actorUriOf.
  • de composer-kaart las op beide clients alleen de oude velden; die had ik in ronde een gemist. De preview zou leeg zijn gebleven.

Wat blijft: shaer:liked en shaer:boosted (per-lezer-interactiestatus, AS2 heeft
er niets voor) en de FEP-633c-termen, die bewust van ons zijn.

Nieuwe wachten: de C2S-leg door de echte route op afwezig dialect -- op de
SLEUTEL, want 'shaer:quote' zit ook in shaer:quoteCards en dat is een poort die
blijft -- en de thread-route, die tot nu toe geen route-dekking had.

Co-Authored-By: Claude Opus 5 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/routes/activitypub.js

    r0db3c72 r75f2897  
    195195  if (audience === 'friend') {
    196196    // The owner's app builds its feed from this leg, and every note here is
    197     // by the site itself: give it the same `shaer:author` byline the timeline
    198     // entries carry, so your own cards get a header too (avatar + name).
     197    // by the site itself, so give it a byline too (avatar + name): de
     198    // ingesloten actor in attributedTo, net als de tijdlijn.
    199199    const me = AP.selfAuthor(baseUrl(req), site);
    200     // De kaart op je eigen post (shaer-k3f): dezelfde shaer:quote/shaer:embed
    201     // die de tijdlijn voor andermans posts draagt, uit de snapshots die
     200    // De kaart op je eigen post (shaer-k3f): dezelfde quote/preview die de
     201    // tijdlijn voor andermans posts draagt, uit de snapshots die
    202202    // deliverCreate bij het publiceren opsloeg. Op note-id gekoppeld, want
    203203    // buildOutbox sorteert en mengt tracks erdoorheen. De embed alleen voor de
     
    213213    for (const it of ob.orderedItems) {
    214214      if (it && it.object && typeof it.object === 'object') {
    215         it.object['shaer:author'] = me;
    216         // En de standaardvorm ernaast (shaer-nmw): de ingesloten actor, zodat
    217         // ook een generieke lezer de byline heeft.
    218215        it.object.attributedTo = AP.actorObject(
    219216          (typeof it.object.attributedTo === 'string' ? it.object.attributedTo : undefined) || AP.actorId(baseUrl(req), site.slug),
     
    222219        const row = byNote.get(it.object.id);
    223220        if (row) {
    224           it.object['shaer:quote'] = AP.timelineQuote(row.quote_json);
    225221          it.object.quote = AP.quoteObject(row.quote_json);
    226222          if (bearerEmbeds) {
    227             it.object['shaer:embed'] = AP.timelineEmbed(row.embed_json, { playback: bearerEmbeds.playback });
    228223            it.object.preview = AP.previewObject(row.embed_json, { playback: bearerEmbeds.playback });
    229224          }
     
    501496        return tags.length ? tags : undefined;
    502497      })(),
    503       // FEP-044f: the resolved quoted post (author + content), so the client
    504       // renders an embedded quote card instead of a bare link. Omitted when the
    505       // note has no quote or the quoted post could not be resolved.
    506       'shaer:quote': quotesAllowed ? AP.timelineQuote(t.quote_json) : undefined,
    507       // The post author's display info (name / @handle / avatar), so every card
    508       // gets a byline header like the quote card. attributedTo stays the bare
    509       // actor URI; this is the resolved presentation Klonkt already stored.
    510       'shaer:author': gateAuthor((t.author_name || t.author_handle || t.author_icon) ? {
    511         name: t.author_name || undefined, handle: t.author_handle || undefined,
    512         icon: t.author_icon || undefined, url: t.author_url || undefined,
    513         // FEP-9098: emojis in the display name (":shortcode:"), if any.
    514         emojis: (() => { try { return t.author_emoji_json ? JSON.parse(t.author_emoji_json) : undefined; } catch { return undefined; } })(),
    515       } : undefined),
    516       // When a followed account boosted this, who did ("X boosted"). Omitted for
    517       // ordinary posts.
    518       'shaer:booster': gateAuthor((t.reblog_name || t.reblog_handle || t.reblog_icon) ? {
    519         name: t.reblog_name || undefined, handle: t.reblog_handle || undefined,
    520         icon: t.reblog_icon || undefined,
    521         // FEP-9098: emojis in the booster's display name (":shortcode:"), if any.
    522         emojis: (() => { try { return t.reblog_emoji_json ? JSON.parse(t.reblog_emoji_json) : undefined; } catch { return undefined; } })(),
    523       } : undefined),
    524498      // Whether THIS account already liked/boosted the note, so the app's
    525499      // detail-view buttons show the current state (and can toggle/undo).
    526500      'shaer:liked': !!(reacties.get(t.id) || {}).liked,
    527501      'shaer:boosted': !!(reacties.get(t.id) || {}).boosted,
    528       // An external (non-fediverse) embed, thumbnail-only and never an iframe.
    529       // Omitted entirely when the gate is closed (see above).
    530       // Carries shaer:playerUrl only when the playback gate is open too.
    531       'shaer:embed': embedsAllowed ? AP.timelineEmbed(t.embed_json, { playback: playbackAllowed }) : undefined,
    532       // De standaardvormen (shaer-nmw): FEP-044f quote als object, AS2 preview
    533       // als kaart. Dezelfde poorten als hun shaer:-tegenhangers hierboven.
     502      // FEP-044f: de geciteerde post als object, zodat de client een kaart
     503      // rendert in plaats van een kale link. AS2 preview is diezelfde kaart
     504      // voor een EXTERNE link: thumbnail, nooit de iframe van de aanbieder.
     505      // Allebei weg zodra hun poort dicht staat; de speler in preview hangt
     506      // aan de playback-poort.
    534507      quote: quotesAllowed ? AP.quoteObject(t.quote_json) : undefined,
    535508      preview: embedsAllowed ? AP.previewObject(t.embed_json, { playback: playbackAllowed }) : undefined,
     
    578551      'shaer:wave': m.wave ? true : undefined,
    579552      'shaer:helpRequest': m.help_request ? true : undefined,
    580       'shaer:quote': quotesAllowed ? AP.timelineQuote(m.quote_json) : undefined,
    581       'shaer:author': gateAuthor((m.actor_name || m.actor_handle || m.actor_icon) ? {
    582         name: m.actor_name || undefined, handle: m.actor_handle || undefined,
    583         icon: m.actor_icon || undefined, url: m.actor_url || undefined,
    584         emojis: (() => { try { return m.actor_emoji_json ? JSON.parse(m.actor_emoji_json) : undefined; } catch { return undefined; } })(),
    585       } : undefined),
    586       'shaer:embed': embedsAllowed ? AP.timelineEmbed(m.embed_json, { playback: playbackAllowed }) : undefined,
    587553      quote: quotesAllowed ? AP.quoteObject(m.quote_json) : undefined,
    588554      preview: embedsAllowed ? AP.previewObject(m.embed_json, { playback: playbackAllowed }) : undefined,
     
    612578      tag: [{ type: 'Mention', href: me, name: myHandle }, ...(AP.timelineEmojis(m.emoji_json) || [])],
    613579      attachment: AP.timelineAttachments(m.media_json),
    614       'shaer:quote': AP.timelineQuote(m.quote_json),
    615       'shaer:author': (m.actor_name || m.actor_handle || m.actor_icon) ? {
    616         name: m.actor_name || undefined, handle: m.actor_handle || undefined,
    617         icon: m.actor_icon || undefined, url: m.actor_url || undefined,
    618         emojis: (() => { try { return m.actor_emoji_json ? JSON.parse(m.actor_emoji_json) : undefined; } catch { return undefined; } })(),
    619       } : undefined,
    620       'shaer:embed': embedsAllowed ? AP.timelineEmbed(m.embed_json, { playback: playbackAllowed }) : undefined,
    621580      quote: quotesAllowed ? AP.quoteObject(m.quote_json) : undefined,
    622581      preview: embedsAllowed ? AP.previewObject(m.embed_json, { playback: playbackAllowed }) : undefined,
     
    637596    object: {
    638597      ...n, content: AP.stripLeadingMentions(n.content),
    639       'shaer:author': mine,
    640598      attributedTo: AP.actorObject(typeof n.attributedTo === 'string' ? n.attributedTo : me, mine),
    641599    },
     
    957915  AP.sendAP(res, {
    958916    '@context': AP.AP_CONTEXT,
    959     'shaer:quote': AP.timelineQuote(uit.quoteJson),
    960     'shaer:embed': embedsAllowed ? AP.timelineEmbed(uit.embedJson, { playback }) : undefined,
    961917    quote: AP.quoteObject(uit.quoteJson),
    962918    preview: embedsAllowed ? AP.previewObject(uit.embedJson, { playback }) : undefined,
     
    996952    attachment: AP.gateAttachments(n.attachment, { images: imagesOk, audio: musicOk }),
    997953    tag: emojiOk ? n.tag : AP.stripEmojiTags(n.tag),
    998     'shaer:author': (n['shaer:author'] && !emojiOk) ? { ...n['shaer:author'], emojis: undefined } : n['shaer:author'],
     954    // De emoji-poort knipt in de byline zelf: FEP-9098 zit in de tag van de
     955    // ingesloten actor, niet meer in een eigen emoji-kaart ernaast.
     956    attributedTo: (!emojiOk && n.attributedTo && typeof n.attributedTo === 'object')
     957      ? { ...n.attributedTo, tag: undefined } : n.attributedTo,
    999958  }));
    1000959  uit.hidden = kring.hidden;
Note: See TracChangeset for help on using the changeset viewer.