Changeset 55eca8b in Klonkt for test/sent-notes.test.js


Ignore:
Timestamp:
07/30/2026 12:49:18 PM (6 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
1a2f206
Parents:
6a99668
Message:

Inkomende replies op je eigen posts bereiken nu ook de app

Robins melding (30-7): de reply komt niet binnen bij de ander. Hij kwam
wel binnen: als interactie (het commentaar-mechaniek van de web-kant),
waar de inbound-handler bewust stopt voordat de mention-opslag draait.
Maar de C2S-leesroute van de app serveerde alleen timeline, mentions en
(sinds vandaag) eigen verzonden notes; een reply op je eigen post viel
er dus overal buiten en de app van de ontvanger bleef leeg.

De read krijgt een vierde leg: getReplyMessages serveert de
reply-interacties op je eigen posts als Create(Note), zelfde vorm als
de andere legs (media, quote en embed rijden de opgeslagen JSON mee,
Mention-tag zodat de app de afzender als gesprek groepeert, inReplyTo
naar de eigen post).

Changed files:
src/services/ActivityPubService.js

  • getReplyMessages(slug): reply-interacties via posts->sites join

src/routes/activitypub.js

  • C2S inbox-read: replies-leg naast timeline, messages en sent

test/sent-notes.test.js

  • inkomende reply wordt geserveerd voor de posteigenaar (met media), en alleen voor die eigenaar

remarks: dit moet op BEIDE kanten draaien om de cirkel rond te maken:
jouw server toont jou de replies van Nessie, koffieengaar moet updaten
om Nessie de jouwe te tonen.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • test/sent-notes.test.js

    r6a99668 r55eca8b  
    4444});
    4545
     46test("an inbound reply on your post reaches the app's message stream", () => {
     47  // The other half of "komt niet binnen bij de ander": inbound replies live
     48  // in ap_interactions (web comments), never in ap_mentions, so the C2S read
     49  // never served them. getReplyMessages is the leg that does.
     50  db.prepare(`INSERT INTO posts (id, site_id, author_id, slug, title, content, status, published_at, created_at, updated_at)
     51              VALUES ('p9','s1','u1','n-p9','', '<p>x</p>','published',datetime('now'),datetime('now'),datetime('now'))`).run();
     52  db.prepare(`INSERT INTO ap_interactions (kind, post_id, object_uri, actor_uri, actor_name, actor_handle, content, published, parent_uri, visibility, media_json, created_at)
     53              VALUES ('reply','p9','https://unresolvable.invalid/notes/77','https://unresolvable.invalid/u/ness','Ness','@ness@unresolvable.invalid','<p>hoi terug</p>','2026-07-30T12:00:00Z','https://klonkt.test/ap/notes/p9','followers','[{"url":"https://unresolvable.invalid/m/f.jpg","type":"image/jpeg"}]',CURRENT_TIMESTAMP)`).run();
     54  const rows = AP.getReplyMessages('me', 60);
     55  const r = rows.find((x) => x.object_uri === 'https://unresolvable.invalid/notes/77');
     56  assert.ok(r, 'the reply is served for the post owner');
     57  assert.equal(r.parent_uri, 'https://klonkt.test/ap/notes/p9', 'threads under the post');
     58  assert.equal(r.actor_handle, '@ness@unresolvable.invalid');
     59  assert.ok(r.media_json.includes('f.jpg'), 'its media rides along');
     60  assert.equal(AP.getReplyMessages('bestaat-niet', 60).length, 0, 'and only for the post owner');
     61});
     62
    4663test('a duplicate reply is idempotent success with the SAME id, not a 502', async () => {
    4764  const first = await AP.deliverReply(site, { postId: '', postSlug: null, parent, text: 'nogmaals', visibility: 'friends' });
Note: See TracChangeset for help on using the changeset viewer.