Ignore:
Timestamp:
07/24/2026 06:04:03 PM (7 weeks ago)
Author:
Robin Genis <roboburr@…>
Branches:
main
Children:
780a7c6
Parents:
1a2d8ac
Message:

Guardian-PWA: duidelijker + verstuurde offer altijd zichtbaar

Twee klachten opgelost.

"Ik zie niet dat ik verstuurd heb": de offer werd wél opgeslagen, maar als de
directe bezorging aan de remote ward faalde gaf de flow 502 en ververste de
PWA niet, dus de kaart verscheen niet. Nu: bezorging is async met retry (de
delivery-queue), de handshake geeft altijd 202 (opgeslagen) met een
delivered-vlag, en de PWA ververst altijd en toont de offer onder een eigen
sectie "Verzonden aanvragen · wacht op antwoord". Faalt de eerste bezorging,
dan meldt de UI dat we blijven proberen.

"Mag allemaal duidelijker": de pagina is herzien met vaste secties met kop en
uitleg: Hulpverzoeken (met teller), Ward adopteren (met uitleg wat er gebeurt),
Verzonden aanvragen, Mijn wards (actief-tag), Meldingen. Statussen als tags,
nette lege staten, alles via i18n (nl/en/de).

Changed files:
src/services/ActivityPubService.js

  • deliverToActor: enqueue+retry+logging, geeft {delivered, inbox}

src/services/guardianship/handshake.js

src/routes/guardian.js

  • /adopt niet meer hard falen op bezorg-hik; delivered terug; meer strings

src/views/pages/guardian.ejs

  • herziene, duidelijke secties

src/assets/js/guardian.js

  • aparte "Verzonden aanvragen"-sectie, altijd verversen na adopt

src/assets/css/guardian.css

  • sectie-koppen, status-tags, nette lege staten

src/services/i18n.js

  • uitgebreide guardian.*-teksten nl/en/de

remarks: als de offer "niet binnenkomt" bij de ward, moet diens Klonkt de
nieuwe code draaien (demo/beta/demohub zijn bij); een oude Klonkt of Mastodon
snapt de Offer-Relationship niet.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r1a2d8ac rc26cc18  
    31293129  return actorId(base, slug);
    31303130}
    3131 // Deliver one activity to one actor's inbox, signed; queued on failure.
     3131// Deliver one activity to one actor's inbox, signed; queued + retried on any
     3132// hiccup so a slow or briefly-down ward server never loses the offer. Returns
     3133// { delivered, inbox }: delivered=false means the account could not be
     3134// resolved at all (a bad handle) — the offer stays recorded regardless.
    31323135async function deliverToActor(site, actorUri, activity) {
    3133   const a = await fetchActor(actorUri).catch(() => null);
    3134   const inbox = a && (a.inbox || (a.endpoints && a.endpoints.sharedInbox));
    3135   if (!inbox) return false;
    31363136  const me = selfActorId(site.slug);
    31373137  const keys = getOrCreateKeys(site.slug);
    31383138  const payload = { '@context': AP_CONTEXT, ...activity };
     3139  const a = await fetchActor(actorUri).catch(() => null);
     3140  const inbox = a && (a.inbox || (a.endpoints && a.endpoints.sharedInbox));
     3141  if (!inbox) {
     3142    console.warn('[AP] guardianship: could not resolve an inbox for', actorUri, '(offer recorded, not sent)');
     3143    return { delivered: false, inbox: null };
     3144  }
    31393145  try {
    31403146    const st = await deliver(inbox, payload, `${me}#main-key`, keys.private_pem);
    3141     if (st >= 200 && st < 300) return true;
    3142   } catch { /* fall through to the queue */ }
     3147    if (st >= 200 && st < 300) { console.log('[AP] guardianship', activity.type, 'delivered →', inbox, st); return { delivered: true, inbox }; }
     3148    console.warn('[AP] guardianship', activity.type, 'got', st, 'from', inbox, '→ queued for retry');
     3149  } catch (e) { console.warn('[AP] guardianship', activity.type, 'to', inbox, 'failed:', e.message, '→ queued for retry'); }
    31433150  enqueueDelivery(site.slug, inbox, payload);
    3144   return true;   // queued: it will arrive
     3151  return { delivered: true, inbox };   // queued: the retry worker gets it there
    31453152}
    31463153Guardianship.wireDelivery({
Note: See TracChangeset for help on using the changeset viewer.