Changeset 31288dc in Klonkt


Ignore:
Timestamp:
10/26/2026 01:18:33 PM (26 hours ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
bfa3ba3
Parents:
4ae254a
Message:

Wakker worden: aankondigen en inhalen na echte afwezigheid

De wakker-helft van shaer-xzab (xzab.4 en .5), zoals Bart hem ontwierp: één
routine met twee helften, en wakker worden herkend aan een sprong in de
wandklok tussen twee ticks of aan het opstarten na lang uit -- niet aan elke
herstart, want npm herstart Klonkt bij elke opgeslagen wijziging.

services/wake.js. Het laatste teken van leven staat elke minuut in
app_settings (last_alive_at), zodat het een herstart overleeft. Meer dan een
half uur stilte is een terugkomst; dan:

.5 AANKONDIGEN: per site een actor-Update naar de gedeelde inboxes van de
volgers (deliverActorUpdate). Uit xzab.6: een binnenkomende POST is wat
Mastodon, Akkoma en Misskey weer naar ons laat bezorgen, en wat bij Pleroma
de controle van onze / start. Een half uur en niet langer, omdat Pleroma ons
al na één uitgeputte bezorging afschrijft.

.4 INHALEN: de outboxes van wie je volgt (alleen geaccepteerd), ondertekend,
vanaf het wegvallen. backfillFromOutbox kreeg daarvoor since; een post
zonder datum telt dan niet mee. Niet verder terug dan een week, hoogstens 40
posts per account en 200 accounts per site, na elkaar met een adempauze,
zodat een week weg geen storm wordt.

Eerst aankondigen, dan inhalen: dan bezorgen de anderen alweer terwijl wij
nog lezen. Een site die niet lukt, houdt de rest niet op.

test/wake.test.js: negen toetsen, het inhalen tegen een echte outbox op
127.0.0.1. Elf mutaties apart gedraaid, elk gevangen. Volledige suite 1371
groen.

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

Files:
2 added
2 edited

Legend:

Unmodified
Added
Removed
  • src/server.js

    r4ae254a r31288dc  
    7070import oauthRoutes from './routes/oauth.js';
    7171import { apWants, startDeliveryWorker, selfHealTimeline, migrateReactions } from './services/ActivityPubService.js';
     72import { startWakeWatch } from './services/wake.js';
    7273
    7374// SESSION_SECRET: use the env var if set. Otherwise auto-generate a strong one
    … …  
    210211startScheduler(); // release planning: publish scheduled posts when publish_at is reached
    211212startDeliveryWorker(); // retry failed fediverse deliveries with backoff
     213// Wakker worden na echte afwezigheid (shaer-xzab.4/.5): aankondigen en inhalen.
     214// Niet bij een gewone herstart; zie services/wake.js.
     215startWakeWatch();
    212216// Once per REACTIONS_MIGRATION_VERSION bump: reacties naar de tussentabel, onder
    213217// de canonieke object-URI. Moet VOOR het serveren, want vanaf nu leest de code
  • src/services/ActivityPubService.js

    r4ae254a r31288dc  
    31993199// history-from-before-you-followed or a delivery that was missed while you were down;
    32003200// reading the outbox is the spec-conform way to catch up. PULL ONLY — sends nothing.
    3201 export async function backfillFromOutbox(slug, actorUri, limit = 20) {
     3201//
     3202// `since` (ms of een ISO-datum): alleen wat daarna gepubliceerd is. Voor het
     3203// inhalen na een afwezigheid (shaer-xzab.4): dan hoort niet de hele eerste
     3204// pagina erbij, alleen wat er sinds het wegvallen bij kwam. Een post zonder
     3205// datum telt dan niet mee -- van die weet je niet of hij gemist is.
     3206export async function backfillFromOutbox(slug, actorUri, limit = 20, { since = null } = {}) {
    32023207  try {
    32033208    if (!slug || !actorUri) return 0;
    … …  
    32233228      if (o.type && o.type !== 'Note' && o.type !== 'Article' && o.type !== 'Question') continue; // skip boosts/other
    32243229      if (o.inReplyTo) continue;                                          // top-level only
     3230      if (since != null) {
     3231        const t = Date.parse(o.published || '');
     3232        if (!Number.isFinite(t) || t < new Date(since).getTime()) continue;
     3233      }
    32253234      const auth = actorUriOf(o.attributedTo);
    32263235      if (auth && auth !== actorUri) continue;                            // their OWN posts only
Note: See TracChangeset for help on using the changeset viewer.