const fs = require('node:fs'); const crypto = require('node:crypto'); const hash = value => crypto.createHash('sha256').update(value).digest('hex'); const files = ['viewer.js', 'media/parasito-crawl3-paredes.mp4', 'media/parasito-crawl3-paredes.png', 'media/parasito-climb-pared.mp4', 'media/parasito-climb-pared.png', 'media/parasito-crawl.mp4', 'media/parasito-lore.mp4', 'media/parasito-attack.mp4', 'auditoria/manifest.json', 'auditoria/codigo/src--main--java--ar--com--companeros--horror--client--ParasiteRig.java.txt']; // PUBLICACIÓN: comparar bytes anónimos del servidor con los archivos preparados. (async () => { const origins = ['https://raps-huesped.pages.dev/', 'https://preview.raps-huesped.pages.dev/']; if (!process.argv.includes('--cloudflare-only')) origins.push('https://raps-galeria-auditoria.jgf1509.chatgpt.site/'); const version = hash(fs.readFileSync('dist/visor/auditoria/manifest.json')).slice(0, 12); const results = await Promise.allSettled(origins.map(async origin => { for (const file of files) { const response = await fetch(origin + file + '?v=' + version, {signal: AbortSignal.timeout(20000)}); if (!response.ok) throw new Error(origin + file + ' HTTP ' + response.status); const remote = Buffer.from(await response.arrayBuffer()); if (hash(remote) !== hash(fs.readFileSync('dist/visor/' + file))) throw new Error('Contenido desactualizado: ' + origin + file); } return {origin, verified_files: files.length, status: 'public bytes match current files'}; })); for (const result of results) { if (result.status === 'fulfilled') console.log(JSON.stringify(result.value)); else {console.error(result.reason.message); process.exitCode = 1;} } // AUDITORÍA: el manifiesto debe corresponder al texto que recibe el lector. const manifest = JSON.parse(fs.readFileSync('dist/visor/auditoria/manifest.json', 'utf8')); for (const entry of manifest) { const text = fs.readFileSync('dist/visor/auditoria/codigo/' + entry.path.replaceAll('/', '--') + '.txt'); if (hash(text) !== entry.sha256 || text.length !== entry.bytes) throw new Error('Manifest mismatch: ' + entry.path); } console.log('Public manifest verified: ' + manifest.length + ' files'); })().catch(error => {console.error(error.message); process.exitCode = 1;});