Changeset ba76bf5 in Klonkt
- Timestamp:
- 08/07/2026 05:33:24 PM (5 weeks ago)
- Branches:
- main
- Children:
- ed5e7ab
- Parents:
- 952baf3
- git-author:
- Robin <roboburr@…> (08/07/2026 05:32:58 PM)
- git-committer:
- Robin <roboburr@…> (08/07/2026 05:33:24 PM)
- Files:
-
- 1 added
- 2 edited
-
src/config/database.js (modified) (3 diffs)
-
src/services/ArchiveExportService.js (modified) (1 diff)
-
test/feed-state-triggers.test.js (added)
Legend:
- Unmodified
- Added
- Removed
-
src/config/database.js
r952baf3 rba76bf5 499 499 ); 500 500 CREATE INDEX IF NOT EXISTS idx_ap_timeline_slug ON ap_timeline(slug, published); 501 -- canonicalReactionUri herleidt een permalink naar het object-id door op (slug, url) 502 -- te zoeken. Zonder deze index viel dat terug op idx_ap_timeline_slug, dus een scan 503 -- van elke rij van die slug. Dat gebeurt PER REACTIE in getInteractions, en de 504 -- reactie-migratie erft het in haar re-key-join, die synchroon vóór listen draait: 505 -- de opstartkosten waren reacties maal tijdlijnrijen. 506 CREATE INDEX IF NOT EXISTS idx_ap_timeline_url ON ap_timeline(slug, url); 501 507 CREATE TABLE IF NOT EXISTS ap_blocks ( 502 508 id INTEGER PRIMARY KEY AUTOINCREMENT, … … 850 856 } 851 857 // slug + object_uri verschillen per bron; de rest is voor alle vier gelijk. 852 const zet = (naam, gebeurtenis, tabel, slug, uri, kind, extra = '' ) => `858 const zet = (naam, gebeurtenis, tabel, slug, uri, kind, extra = '', wanneer = '') => ` 853 859 DROP TRIGGER IF EXISTS ${naam}; 854 CREATE TRIGGER ${naam} AFTER ${gebeurtenis} ON ${tabel} BEGIN860 CREATE TRIGGER ${naam} AFTER ${gebeurtenis} ON ${tabel}${wanneer ? ` WHEN ${wanneer}` : ''} BEGIN 855 861 UPDATE ap_feed_rev SET n = n + 1; 856 862 INSERT INTO ap_feed_state (slug, object_uri, rev, kind) … … 874 880 // ap_interactions draagt geen slug: die hangt aan de POST. Vandaar de join, 875 881 // en vandaar dat deze drie niet in de gewone vorm passen. 876 zet('trg_feed_ia_ins', 'INSERT', 'ap_interactions', '', '', '', `${joinPosts('NEW.object_uri', 'new')} WHERE p.id = NEW.post_id`), 877 zet('trg_feed_ia_upd', 'UPDATE OF content, media_json, quote_json, embed_json', 'ap_interactions', '', '', '', `${joinPosts('NEW.object_uri', 'updated')} WHERE p.id = NEW.post_id`), 878 zet('trg_feed_ia_del', 'DELETE', 'ap_interactions', '', '', '', `${joinPosts('OLD.object_uri', 'deleted')} WHERE p.id = OLD.post_id`), 882 // 883 // De WHEN op kind='reply' is nodig omdat deze tabel ook likes en announces 884 // draagt, en die schrijven object_uri = '' (zie recordInteraction). Zonder de 885 // WHEN bumpte elke inkomende like de rev, werd elke wachter gewekt en kreeg 886 // die de hele collectie opnieuw terwijl er niets aan veranderd was: precies de 887 // kosten die de 304 moest wegnemen. Bovendien belandde er dan een rij op de 888 // lege string in ap_feed_state, die feedChangesSince vervolgens uitdeelt. 889 // De oude cursor filterde hier wel op kind; bij ap_timeline is dit ook gedaan 890 // (de UPDATE OF sluit liked/boosted uit) en één tabel verder vergeten. 891 zet('trg_feed_ia_ins', 'INSERT', 'ap_interactions', '', '', '', `${joinPosts('NEW.object_uri', 'new')} WHERE p.id = NEW.post_id`, "NEW.kind = 'reply'"), 892 zet('trg_feed_ia_upd', 'UPDATE OF content, media_json, quote_json, embed_json', 'ap_interactions', '', '', '', `${joinPosts('NEW.object_uri', 'updated')} WHERE p.id = NEW.post_id`, "NEW.kind = 'reply'"), 893 zet('trg_feed_ia_del', 'DELETE', 'ap_interactions', '', '', '', `${joinPosts('OLD.object_uri', 'deleted')} WHERE p.id = OLD.post_id`, "OLD.kind = 'reply'"), 879 894 ].join('\n')); 880 895 } catch (e) { -
src/services/ArchiveExportService.js
r952baf3 rba76bf5 38 38 39 39 const sha256 = (buf) => crypto.createHash('sha256').update(buf).digest('hex'); 40 const toISO = (d) => { const t = Date.parse(d); return isNaN(t) ? null : new Date(t).toISOString(); }; 40 // SQLite's CURRENT_TIMESTAMP schrijft 'YYYY-MM-DD HH:MM:SS' in UTC, zonder marker. 41 // Kale Date.parse leest dat als LOKALE tijd, dus op een server op UTC+2 ging er twee 42 // uur van elke stempel af voordat hij het archief in ging. Die verschuiving wordt bij 43 // het exporteren ingebakken en valt niet weg bij het importeren: exporteer je in 44 // Amsterdam, dan is die post overal permanent twee uur te vroeg, en in zomer- en 45 // wintertijd verschillend. Het raakte de stempels die de database zelf zet (concepten, 46 // ingeplande posts, gearchiveerde antwoorden), niet die uit de editor, dus de schade 47 // was stil en gedeeltelijk. EXPORT-FORMAT.md schreef altijd al "ISO 8601, UTC" voor. 48 // Zelfde regel als isoStamp() in ActivityPubService en stampMs() in guardianship/offers. 49 const SQL_STAMP = /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(\.\d+)?$/; 50 const toISO = (d) => { 51 const s = String(d == null ? '' : d); 52 const t = Date.parse(SQL_STAMP.test(s) ? `${s.replace(' ', 'T')}Z` : s); 53 return isNaN(t) ? null : new Date(t).toISOString(); 54 }; 41 55 42 56 const MIME_BY_EXT = {
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)