Changeset 6e9bc70 in Klonkt for src/services/ap-inbox.js


Ignore:
Timestamp:
10/12/2026 04:15:08 PM (2 days ago)
Author:
Bart <bart@…>
Branches:
main
Children:
61d52ed
Parents:
746d98a
Message:

Zachte groepen: een gesprek is de set deelnemers, niet één tegenpartij

Een direct bericht aan Anna en Ben bestond al als groep -- to_actors droeg de
hele set -- maar elke lezing sleutelde op één other. Een uitgaand bericht
aan twee mensen viel in twee gesprekken uiteen, en een binnenkomend bericht
van Anna aan jou en Ben kwam alleen bij Anna terecht: Ben viel eruit, want de
adressering van een binnenkomer werd nergens bewaard.

Nu is er een sleutel, één keer berekend bij het schrijven
(conversation-key.js): voor één ander zijn kale URI, precies zoals het altijd
was, dus bestaande gesprekken, leesmarkeringen en ?with=-URL's blijven geldig
zonder migratie; voor een groep de gesorteerde set, gescheiden door een
spatie. Koppen, geschiedenis, leesmarkeringen en ongelezen lezen hem allemaal
via dezelfde unie, en werken daarmee per gesprek zonder dat er in die queries
iets hoefde te veranderen. Oude rijen hebben geen sleutel en lezen zoals ze
altijd lazen.

Alleen directe berichten groeperen: een openbare post aan jou en Ben is geen
besloten gesprek met z'n drieën.

/messages neemt meer dan één with, en elk item draagt shaer:conversation en
shaer:participants. Uitgaande directe notes krijgen een FEP-7888 context --
die van de ouder als het een antwoord is, anders een nieuwe -- die bewaard en
uitgestuurd wordt, maar geen bubbels samenvoegt: een bubbel die Carla toont
terwijl je antwoord haar niet bereikt, zou liegen over wie meeleest.

shaer-mbji
Co-Authored-By: Claude Opus 5.5 <claude@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ap-inbox.js

    r746d98a r6e9bc70  
    3030import { fwStmts } from './ap-following.js';
    3131import * as HubInvite from './hub-invite.js';
     32import * as ConversationKey from './conversation-key.js';
    3233
    3334/**
    … …  
    852853            // laten voor iedereen die de objectvorm stuurt.
    853854            const ouder = safeUrl(typeof o.inReplyTo === 'string' ? o.inReplyTo : (o.inReplyTo && o.inReplyTo.id)) || null;
    854             const r = db.prepare(`INSERT OR IGNORE INTO ap_mentions (slug, object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, actor_url, content, published, in_reply_to, help_request, wave, has_guardians, emoji_json, actor_emoji_json, media_json, created_at)
    855                                   VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,${NU_ISO})`)
     855            // WIE ER NOG MEER BIJ WAS (shaer-mbji). De afzender plus iedere
     856            // persoon in to/cc, zonder ons. Zonder dit wist een bericht van
     857            // Anna aan jou en Ben niet meer dat Ben erbij was, en kwam het
     858            // alleen in het gesprek met Anna terecht.
     859            //
     860            // ALLEEN VOOR EEN DIRECT BERICHT. Deze tabel draagt ook publieke
     861            // posts die ons noemen, en een openbare post aan jou en Ben is geen
     862            // besloten gesprek met z'n drieën -- dat zou een groep verzinnen
     863            // die niemand begon. Die blijft bij zijn afzender, zoals altijd.
     864            const ander = noteVisibility(o) === 'direct'
     865              ? ConversationKey.participantsOf(o, actorUri, actorId(base, slug))
     866              : [actorUri];
     867            const conv = ConversationKey.conversationKey(ander) || actorUri;
     868            const r = db.prepare(`INSERT OR IGNORE INTO ap_mentions (slug, object_uri, note_url, actor_uri, actor_name, actor_handle, actor_icon, actor_url, content, published, in_reply_to, help_request, wave, has_guardians, emoji_json, actor_emoji_json, media_json, conv, participants, context, created_at)
     869                                  VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,${NU_ISO})`)
    856870              .run(slug, o.id, safeUrl(o.url) || null, actorUri, ai.name, ai.handle, ai.icon, ai.url, html, o.published || null, ouder, help ? 1 : 0, wave ? 1 : 0, hasG ? 1 : 0,
    857                 extractEmojiTags(o.tag), emojiJsonOf(ai.emojis), mediaFromNote(o));
     871                extractEmojiTags(o.tag), emojiJsonOf(ai.emojis), mediaFromNote(o),
     872                conv, JSON.stringify(ander), ConversationKey.contextOf(o));
    858873            if (r.changes) {
    859874              // The quote / link-preview card resolves out of band (a remote
Note: See TracChangeset for help on using the changeset viewer.