Ignore:
Timestamp:
08/07/2026 09:14:32 AM (5 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
44c9f3f
Parents:
f2a7181
git-author:
Robin <roboburr@…> (08/07/2026 09:14:20 AM)
git-committer:
roboburr <roboburr@…> (08/07/2026 09:14:32 AM)
Message:

De merksteen wordt een koppeltabel in plaats van een afleiding (shaer-n05)

Barts onderbuik, en hij had gelijk. De merksteen leunde op MAX(rowid) over vier
tabellen: een TOEVALLIGE eigenschap, geen feit dat ergens is opgeschreven.
Dezelfde fout als reacties uitlezen uit ap_timeline.liked, en met dezelfde soort
gebreken -- hij zag aangroei maar geen verandering, en hij kon achteruit lopen.

Nu ap_feed_state: een rij per bericht per tijdlijn, met een oplopende rev en een
kind (new | updated | deleted). Dat beantwoordt drie vragen die anders drie eigen
oplossingen zouden krijgen: is er iets veranderd sinds N, WAT is er veranderd, en
is dit bericht bewerkt. Die derde maakt de "bewerkt"-markering uit shaer-of7
straks een leesactie in plaats van een bouwsel.

Een STAND en geen logboek: vijf keer bewerken blijft één rij, dus er groeit niets
en er valt niets te snoeien. Mijn eerste test ging uit van een log en viel daar
terecht over.

Bijgehouden door TRIGGERS, om dezelfde reden dat er geen emitter is: een trigger
zit in de database, dus geen codepad kan hem vergeten. De teller staat in een
eigen tabel en niet in MAX(rev), want die zou terugzakken zodra de hoogste rij
verdwijnt -- en dan denkt een client dat er niets gebeurd is.

DE VAL WAAR DIT BIJNA IN LIEP: een like schrijft ap_timeline.liked en een 🔁
schrijft .boosted. Zonder afbakening zou je eigen like het bericht als BEWERKT
merken en elke wachtende client wekken. Vandaar de UPDATE OF-kolomlijsten; die
zijn niet decoratief.

Nagemeten wat ik wilde zien voordat dit erin ging: een INSERT OR IGNORE die niets
doet vuurt geen trigger, en de trigger op ap_interactions joint correct via posts
naar sites (die tabel draagt zelf geen slug).

De cursor is nu een getal in plaats van "23.2.8.2". Een client met een oude
cursor krijgt meteen antwoord met de nieuwe; dat heelt zichzelf.

16 tests in feed-wait. Suite 544/544.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    rf2a7181 rd14bf1c  
    35023502 */
    35033503export function feedCursor(slug) {
    3504   const max = (sql, ...args) => { try { const r = db.prepare(sql).get(...args); return (r && r.n) || 0; } catch { return 0; } };
    3505   const t = max('SELECT MAX(rowid) AS n FROM ap_timeline WHERE slug = ?', slug);
    3506   const m = max('SELECT MAX(rowid) AS n FROM ap_mentions WHERE slug = ?', slug);
    3507   const o = max('SELECT MAX(rowid) AS n FROM ap_outbox WHERE site_slug = ?', slug);
    3508   const r = max(`SELECT MAX(i.rowid) AS n FROM ap_interactions i
    3509                    JOIN posts p ON p.id = i.post_id
    3510                    JOIN sites s ON s.id = p.site_id
    3511                   WHERE s.slug = ? AND i.kind = 'reply'`, slug);
    3512   return `${t}.${m}.${o}.${r}`;
     3504  try {
     3505    const r = db.prepare('SELECT MAX(rev) AS n FROM ap_feed_state WHERE slug = ?').get(slug);
     3506    return String((r && r.n) || 0);
     3507  } catch { return '0'; }
     3508}
     3509
     3510/**
     3511 * Wat er sinds `rev` met deze tijdlijn gebeurd is: welke berichten er nieuw zijn,
     3512 * bewerkt, of weg.
     3513 *
     3514 * Nog niet gebruikt door een leespad -- de vorm van de aankomst is shaer-of7 en
     3515 * de "bewerkt"-markering is daar nog een open beslissing. Maar de gegevens
     3516 * ontstaan hoe dan ook bij het bijhouden van de merksteen, en dit is de enige
     3517 * plek waar ze samen te lezen zijn.
     3518 */
     3519export function feedChangesSince(slug, rev, limit = 200) {
     3520  try {
     3521    return db.prepare(`SELECT object_uri, kind, rev FROM ap_feed_state
     3522                        WHERE slug = ? AND rev > ? ORDER BY rev ASC LIMIT ?`)
     3523      .all(slug, parseInt(rev, 10) || 0, limit);
     3524  } catch { return []; }
    35133525}
    35143526
     
    53245336  buildActor, buildNote, buildCreate, buildOutbox, buildFollowers, buildFollowing, buildFeatured,
    53255337  followerCount, deliver, fetchActor, verifyRequest, handleInbox, deliverCreate, deliverDelete, deliverUpdate, deliverActorUpdate, resyncFeaturedPins,
    5326   feedCursor, waitForFeedChange,
     5338  feedCursor, feedChangesSince, waitForFeedChange,
    53275339  getInteractions, getInteractionById, setInteractionBoosted, setInteractionLiked, buildReplyNote, getOutboxNote, getSentNotes, deliverReply, resolveRemoteNote, noteAudience, mayReadNote,
    53285340  listOutbox, deliverOutboxDelete, deliverOutboxUpdate, deliverDirectNote,
Note: See TracChangeset for help on using the changeset viewer.