Changeset ed5e7ab in Klonkt for src/services/ArchiveExportService.js
- Timestamp:
- 08/07/2026 05:41:20 PM (5 weeks ago)
- Branches:
- main
- Children:
- c25eff7
- Parents:
- ba76bf5 (diff), a4fea5e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/services/ArchiveExportService.js (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/services/ArchiveExportService.js
rba76bf5 red5e7ab 38 38 39 39 const sha256 = (buf) => crypto.createHash('sha256').update(buf).digest('hex'); 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+)?$/; 40 /** 41 * Naar ISO 8601 in UTC. 42 * 43 * SQLite schrijft CURRENT_TIMESTAMP als "2026-07-01 12:56:10" -- in UTC, maar 44 * ZONDER zone erbij. Date.parse leest die vorm als LOKALE tijd, en dan schuift 45 * elk tijdstempel in het archief mee met de tijdzone van de machine die de export 46 * draait. Op een server in Amsterdam is dat twee uur, en dat merk je pas als je 47 * ergens anders importeert. 48 * 49 * Gevonden doordat Bart vroeg of dit wel naar UTC normaliseert. De testmachine 50 * draait op UTC, dus geen enkele test kon het zien. 51 */ 50 52 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 if (!d) return null; 54 const s = String(d).trim(); 55 const zonderZone = /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(:\d{2}(\.\d+)?)?$/.test(s); 56 const t = Date.parse(zonderZone ? `${s.replace(' ', 'T')}Z` : s); 53 57 return isNaN(t) ? null : new Date(t).toISOString(); 54 58 }; … … 243 247 const origin = (opts.origin || process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, ''); 244 248 const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug); 245 if (!site) throw new Error(`onbekende site: ${slug}`); 249 if (!site) { 250 // De naam van de INSTANCE (de map, de unit) en de slug van de SITE in zijn 251 // database zijn twee dingen. Ze vallen vaak samen en soms niet, en dan zat je 252 // met een foutmelding die je liet raden. Zeg dus wat er wel in staat. 253 let bestaand = []; 254 try { bestaand = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen sites-tabel */ } 255 const wat = slug ? `onbekende site: ${slug}` : 'geen site opgegeven'; 256 throw new Error(bestaand.length 257 ? `${wat}. In deze database staat: ${bestaand.join(', ')}` 258 : `${wat}. In deze database staat geen enkele site -- wijst DATABASE_PATH naar de juiste?`); 259 } 246 260 247 261 const bestanden = new Map(); // pad -> Buffer
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)