#!/usr/bin/env node // Lädt site/dist nach Arweave via ar.io Turbo hoch. // Dateien <100KiB sind gratis. Der Key in signing-key.json ist NUR ein // Signier-Key für Data-Items — er hält kein Guthaben. const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); const { TurboFactory, EthereumSigner } = require('@ardrive/turbo-sdk'); const KEYFILE = path.join(__dirname, 'signing-key.json'); async function main() { let key; if (fs.existsSync(KEYFILE)) { key = JSON.parse(fs.readFileSync(KEYFILE, 'utf8')).privateKey; } else { key = crypto.randomBytes(32).toString('hex'); fs.writeFileSync(KEYFILE, JSON.stringify({ note: 'Signier-Key fuer Arweave-Uploads (Turbo). Haelt KEIN Guthaben.', created: '2026-08-07', privateKey: key, }, null, 2), { mode: 0o600 }); console.log('Neuer Signier-Key erzeugt:', KEYFILE); } const signer = new EthereumSigner(key); const turbo = TurboFactory.authenticated({ signer, token: 'ethereum' }); // Ordner als Argument (node upload.js dist), sonst das Layout dieses // Repos (publish/ neben site/). Fremde Nutzer: Argument verwenden. const folderPath = process.argv[2] ? path.resolve(process.argv[2]) : path.join(__dirname, '..', 'site', 'dist'); const result = await turbo.uploadFolder({ folderPath, // App-Name landet auch auf dem Manifest — der Zeiger (latest.html) // bevorzugt genau dieses Tag bei der GraphQL-Suche. Published-At ist // der Tie-Break, wenn mehrere Manifeste im selben Block landen // (Intra-Block-Reihenfolge ist NICHT die Upload-Reihenfolge). dataItemOpts: { tags: [ { name: 'App-Name', value: 'kiel-site' }, { name: 'Published-At', value: String(Math.floor(Date.now() / 1000)) }, ], }, manifestOptions: { indexFile: 'index.html', fallbackFile: 'index.html', }, }); console.log('\n=== ERGEBNIS ==='); console.log('Manifest-TxID:', result.manifestResponse?.id); for (const f of result.fileResponses || []) { console.log('Datei:', f.id); } fs.writeFileSync(path.join(__dirname, 'last-upload.json'), JSON.stringify(result, null, 2)); console.log('\nSite: https://arweave.net/' + result.manifestResponse?.id); } main().catch(e => { console.error('FEHLER:', e.message || e); process.exit(1); });