source: Klonkt/test/object-links.test.js@ eb36688

main
Last change on this file since eb36688 was eb36688, checked in by Robin Genis <roboburr@…>, 6 weeks ago

FEP-e232 emit: Klonkt bewaart + serveert object-link (quote) tags op de C2S inbox

De client toonde nog geen quotes omdat Klonkt de Link-tags helemaal niet
doorgaf: de inbox-read serveerde alleen de FEP-9098 Emoji-tags (uit emoji_json),
al het andere werd weggegooid. Nu bewaren we ook de FEP-e232 Link-tags (quotes /
inline object-referenties) en serveren we ze mee, precies gespiegeld op de
emoji-aanpak.

Een Link telt als object-link als de mediaType een AP-object markeert: het
AS2-geprofileerde application/ld+json, of application/activity+json als
gelijkwaardige. Kale hyperlinks (text/html) en Mentions blijven eruit.

De inbox-read combineert nu Emoji- en Link-tags in een enkele tag-array (weg
als de note geen van beide heeft). De self-heal gaat naar v9 zodat bestaande
timeline-rijen de Link-tags eenmalig alsnog oppikken.

Changed files:
src/config/database.js

  • ap_timeline.link_json kolom (FEP-e232 object-link tags)

src/services/ActivityPubService.js

  • extractObjectLinkTags() + timelineObjectLinks() (spiegel van de emoji-functies)
  • link_json opslaan bij inbound Create en bij outbox-backfill
  • self-heal v8 -> v9: link_json meenemen (select, change-detect, update)
  • timelineObjectLinks in de default-export

src/routes/activitypub.js

  • inbox-read serveert Emoji- + Link-tags samen als tag

New file:
test/object-links.test.js

  • extractObjectLinkTags houdt AS2-ld+json en activity+json Links, laat text/html en Mention vallen; round-trip via timelineObjectLinks

remarks: 175 tests groen (was 171).

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

  • Property mode set to 100644
File size: 1.8 KB
Line 
1// FEP-e232: Klonkt keeps inbound object-link (quote/ref) tags and serves them on the C2S inbox read.
2import { test } from 'node:test';
3import assert from 'node:assert/strict';
4process.env.DATABASE_PATH = ':memory:';
5process.env.PUBLIC_BASE_URL = 'https://test.example';
6const dbMod = await import('../src/config/database.js');
7dbMod.initializeDatabase();
8const { extractObjectLinkTags, timelineObjectLinks } = await import('../src/services/ActivityPubService.js');
9const AP = { extractObjectLinkTags, timelineObjectLinks };
10
11test('extractObjectLinkTags keeps AS2-profiled ld+json and activity+json Links; drops plain links and mentions', () => {
12 const tag = [
13 { type: 'Link', mediaType: 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', href: 'https://s/objects/1', name: '#1374' },
14 { type: 'Link', mediaType: 'application/activity+json', href: 'https://s/objects/2', rel: ['https://misskey-hub.net/ns#_misskey_quote'] },
15 { type: 'Link', mediaType: 'text/html', href: 'https://plain.example/page' }, // plain hyperlink → dropped
16 { type: 'Mention', href: 'https://s/u/x' },
17 ];
18 const json = AP.extractObjectLinkTags(tag);
19 assert.ok(json);
20 const back = AP.timelineObjectLinks(json);
21 assert.equal(back.length, 2);
22 assert.equal(back[0].href, 'https://s/objects/1');
23 assert.equal(back[0].name, '#1374');
24 assert.equal(back[1].mediaType, 'application/activity+json');
25});
26
27test('no object links → null / undefined (nothing served)', () => {
28 assert.equal(AP.extractObjectLinkTags([{ type: 'Link', mediaType: 'text/html', href: 'https://x' }]), null);
29 assert.equal(AP.extractObjectLinkTags([{ type: 'Hashtag', name: '#hi' }]), null);
30 assert.equal(AP.timelineObjectLinks(null), undefined);
31 assert.equal(AP.timelineObjectLinks('not json'), undefined);
32});
Note: See TracBrowser for help on using the repository browser.