Ignore:
Timestamp:
08/10/2026 03:42:31 AM (4 weeks ago)
Author:
Bart <bart@…>
Branches:
main
Children:
7e53594
Parents:
8064da1
Message:

Een logboek, zodat de reden ergens blijft staan

Guardianship-events waren vluchtig: onGuardianshipEvent wekte de long-poll,
zocht in een tabel van zeven soorten of er een push bij hoorde, en liet de rest
vallen. Elf van de achttien soorten verdwenen spoorloos, met hun inhoud. Een
weigering droeg reason: 'not_a_teapot' tot precies daar en niet verder --
terwijl §4.2 eist dat de ward en zijn guardians die reden te HOREN krijgen, en
niet dat ze hem afleiden uit een aanbod dat opeens weg is.

Vastleggen en melden zijn nu twee dingen. Alles komt in ap_guardian_events;
welke gebeurtenis een mens wakker maakt blijft de aparte, korte lijst die het
altijd al was.

Ingeklapt en onderaan, want hier vraagt niets om een antwoord. Zou dit tussen
de wachtrijen staan, dan wordt "moet ik iets doen" onleesbaar -- dezelfde reden
waarom de afgehandelde hulpvragen daar al staan.

200 per account, jongste eerst. Een logboek dat oneindig groeit wordt er een
die niemand opent, en afkappen aan de verkeerde kant zou hem onbruikbaar maken
op het moment dat er juist iets gebeurt. Schrijffouten worden geslikt: het
logboek is bijzaak en mag de commit of de weigering zelf nooit meesleuren.

Onbekende soorten vallen in de PWA terug op hun ruwe naam. Zichtbaar en lelijk
is beter dan netjes en afwezig.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r8064da1 rf06ed56  
    60486048 * was hij onbereikbaar, en een mutatie die het wekken weghaalde bleef groen.
    60496049 */
     6050/**
     6051 * Hoeveel er van bewaard blijft. Een logboek dat oneindig groeit is een
     6052 * logboek dat niemand meer opent, en dit is geschiedenis, geen archief: wat
     6053 * ertoe doet staat vooraan.
     6054 */
     6055export const GUARDIAN_EVENT_KEEP = 200;
     6056
     6057/**
     6058 * Leg de gebeurtenis vast VOOR de melding.
     6059 *
     6060 * De meldingstabel beslist wie er wakker van wordt, en dat is terecht een korte
     6061 * lijst -- maar hij besliste daarmee ook wat er onthouden werd, en dat was niet
     6062 * de bedoeling. Elf van de achttien soorten verdwenen spoorloos, met hun inhoud:
     6063 * een geweigerd aanbod droeg de REDEN mee tot hier en niet verder, terwijl §4.2
     6064 * eist dat de ward en zijn guardians die te horen krijgen.
     6065 *
     6066 * Vastleggen en melden zijn nu twee dingen. Alles komt in het logboek; alleen
     6067 * wat een mens moet wekken gaat ook als push de deur uit.
     6068 */
     6069export function recordGuardianEvent(slug, ev) {
     6070  if (!slug || !ev || !ev.kind) return;
     6071  try {
     6072    db.prepare('INSERT INTO ap_guardian_events (slug, kind, payload, created_at) VALUES (?,?,?,CURRENT_TIMESTAMP)')
     6073      .run(slug, String(ev.kind), JSON.stringify(ev));
     6074    db.prepare(`DELETE FROM ap_guardian_events WHERE slug = ? AND id NOT IN
     6075                (SELECT id FROM ap_guardian_events WHERE slug = ? ORDER BY id DESC LIMIT ?)`)
     6076      .run(slug, slug, GUARDIAN_EVENT_KEEP);
     6077  } catch { /* een logboek mag nooit de gebeurtenis zelf breken */ }
     6078}
     6079
     6080/** De laatste gebeurtenissen voor dit account, nieuwste eerst. */
     6081export function listGuardianEvents(slug, limit = 50) {
     6082  try {
     6083    return db.prepare('SELECT id, kind, payload, created_at FROM ap_guardian_events WHERE slug = ? ORDER BY id DESC LIMIT ?')
     6084      .all(slug, Math.max(1, Math.min(Number(limit) || 50, GUARDIAN_EVENT_KEEP)))
     6085      .map((r) => ({ id: r.id, kind: r.kind, created: r.created_at, ...safeJson(r.payload) }));
     6086  } catch { return []; }
     6087}
     6088
     6089function safeJson(s) { try { return JSON.parse(s) || {}; } catch { return {}; } }
     6090
    60506091export function onGuardianshipEvent(slug, ev) {
     6092  recordGuardianEvent(slug, ev);
    60516093  wakeGuardian(slug);
    60526094  const p = guardianEventPush(slug, ev);
     
    61416183  webfingerResolve, followActor, resolveRemoteActor, unfollowActor, handleMoveInbox, moveAccount, listFollowing, setAutoBoost, backfillFromOutbox, getTimeline, getDirectMessages, isoStamp, timelineAttachments, timelineEmojis, timelineObjectLinks, timelineQuote, timelineEmbed, applyQuoteProps, deliverToActor, sendInteraction, voteOnPoll, voteOnRemotePoll,
    61426184  acceptGatedFollow, rejectGatedFollow, isWardGuardian, outboxAudience, sendFollowDecision,
    6143   gateOutgoingFollow, performApprovedFollow,
     6185  gateOutgoingFollow, performApprovedFollow, recordGuardianEvent, listGuardianEvents, GUARDIAN_EVENT_KEEP,
    61446186  parseOwnPoll, pollTally, ownPollView, deliverPollUpdate, maybeCrawlThread, sendReport, localMentionSlugs, previewCard,
    61456187  autoBoostCount, boostedCount, setReaction, getReaction, getReactionsFor, canonicalReactionUri, migrateReactions, upsertBoostedNote, getCirkelPosts, getCirkelMembers, selfHealTimeline,
Note: See TracChangeset for help on using the changeset viewer.