Changeset ae05747 in Klonkt


Ignore:
Timestamp:
07/16/2026 12:20:51 PM (8 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
4424af7
Parents:
226b563
git-author:
Robin <roboburr@…> (07/12/2026 10:34:28 PM)
git-committer:
Robin <roboburr@…> (07/16/2026 12:20:51 PM)
Message:

Fix: federate replies, comment-deletes and reply-edits durably

deliverReply, deliverOutboxDelete and deliverOutboxUpdate delivered with a
bare deliver()+catch and dropped the activity on any failure, so a reply,
a comment-delete or an edit to a briefly-offline recipient was lost with no
retry (unlike posts, which use deliverWithRetry). Each now enqueues the
activity on failure so the existing ap_delivery retry worker resends it.
The worker re-derives the signing key from the actor slug, matching the
keyId used here.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ActivityPubService.js

    r226b563 rae05747  
    15791579  let delivered = 0;
    15801580  for (const inbox of [...inboxes].filter(Boolean)) {
    1581     try { const st = await deliver(inbox, create, keyId, keys.private_pem); if (st >= 200 && st < 300) delivered++; } catch { /* best-effort */ }
     1581    let ok = false;
     1582    try { const st = await deliver(inbox, create, keyId, keys.private_pem); ok = st >= 200 && st < 300; } catch { ok = false; }
     1583    if (ok) delivered++;
     1584    else enqueueDelivery(site.slug, inbox, create); // durable: retry a briefly-offline recipient (was silently dropped)
    15821585  }
    15831586  console.log('[AP] outreply', site.slug, '→', parent.actor_uri, 'delivered', delivered);
     
    16951698    if (row.to_actor) { const a = await fetchActor(row.to_actor).catch(() => null); if (a) inboxes.add((a.endpoints && a.endpoints.sharedInbox) || a.inbox); }
    16961699    for (const f of fStmts().list.all(site.slug)) inboxes.add(f.shared_inbox || f.inbox);
    1697     for (const inbox of [...inboxes].filter(Boolean)) { try { await deliver(inbox, del, `${me}#main-key`, keys.private_pem); } catch { /* best-effort */ } }
     1700    for (const inbox of [...inboxes].filter(Boolean)) {
     1701      try { const st = await deliver(inbox, del, `${me}#main-key`, keys.private_pem); if (st >= 200 && st < 300) continue; } catch { /* queue below */ }
     1702      enqueueDelivery(site.slug, inbox, del); // durable: a failed comment-delete now retries (was silently dropped)
     1703    }
    16981704  }
    16991705  db.prepare('DELETE FROM ap_outbox WHERE id = ?').run(outboxId);
     
    17351741  let delivered = 0;
    17361742  for (const inbox of [...inboxes].filter(Boolean)) {
    1737     try { const st = await deliver(inbox, update, `${me}#main-key`, keys.private_pem); if (st >= 200 && st < 300) delivered++; } catch { /* best-effort */ }
     1743    let ok = false;
     1744    try { const st = await deliver(inbox, update, `${me}#main-key`, keys.private_pem); ok = st >= 200 && st < 300; } catch { ok = false; }
     1745    if (ok) delivered++;
     1746    else enqueueDelivery(site.slug, inbox, update); // durable: retry the edit later (was silently dropped)
    17381747  }
    17391748  console.log('[AP] outreply edit', site.slug, 'delivered', delivered);
Note: See TracChangeset for help on using the changeset viewer.