cram-persist.mjs (2786B)
1 // Persistance de l'Exelmémoire : formate le volume CROS64, laisse la page le sauver en 2 // localStorage, RECHARGE la page, relance CROS64 et affiche Directory : le volume doit être là. 3 // node test/cram-persist.mjs [url] 4 import { open, sleep } from './cdp.mjs'; 5 6 const url = process.argv[2] ?? 'http://127.0.0.1:8195/?game=exeltel&rom=/roms/exeltel.zip'; 7 const KEY = 'exl100.cram.exeltel'; 8 9 const key = async (page, k, code, vk) => { 10 await page.send('Input.dispatchKeyEvent', { type: 'keyDown', key: k, code, windowsVirtualKeyCode: vk }); 11 await sleep(60); 12 await page.send('Input.dispatchKeyEvent', { type: 'keyUp', key: k, code, windowsVirtualKeyCode: vk }); 13 await sleep(320); 14 }; 15 const down = (p) => key(p, 'ArrowDown', 'ArrowDown', 40); 16 const enter = (p) => key(p, 'Enter', 'Enter', 13); 17 const toCros64 = async (p) => { 18 await sleep(8000); // boot EXELTEL 19 await down(p); await down(p); await down(p); // Périphériques 20 await enter(p); await sleep(1200); 21 await enter(p); await sleep(3500); // Exelmémoire -> CROS64 22 }; 23 const lsLen = (p) => p.evaluate(`(localStorage.getItem(${JSON.stringify(KEY)}) || '').length`); 24 25 // Phase 1 : vider la clé, lancer CROS64, formater, attendre la sauvegarde automatique. 26 let page = await open(url, { width: 900, height: 1100 }); 27 await page.evaluate(`localStorage.removeItem(${JSON.stringify(KEY)})`); 28 await toCros64(page); 29 await page.screenshot('/tmp/cp-1-cros64.png'); 30 for (let i = 0; i < 7; i++) await down(page); // Format 31 await enter(page); await sleep(1200); 32 await enter(page); // valide (nom vide) 33 await sleep(5000); // >= 2 ticks d'autosave (2 s) 34 const len1 = await lsLen(page); 35 await page.screenshot('/tmp/cp-2-after-format.png'); 36 console.log('Phase 1 : localStorage après Format =', len1, 'car. (attendu ~21848 pour 16 Ko)'); 37 page.close(); 38 await sleep(800); 39 40 // Phase 2 : nouvelle page (même origine), CROS64 doit retrouver le volume : Directory. 41 page = await open(url, { width: 900, height: 1100 }); 42 const len2 = await lsLen(page); 43 await toCros64(page); 44 await page.screenshot('/tmp/cp-3-cros64-reload.png'); 45 await down(page); await enter(page); // Directory 46 await sleep(900); 47 await enter(page); // sortie : Screen 48 await sleep(1800); 49 await page.screenshot('/tmp/cp-4-directory.png'); 50 const restored = page.logs.filter((l) => /Exelmémoire restaurée/.test(l)); 51 console.log('Phase 2 : clé présente au rechargement =', len2, 'car. ; log restauration :', restored.join(' | ') || '(aucun)'); 52 console.log('Captures : /tmp/cp-1-cros64.png /tmp/cp-2-after-format.png /tmp/cp-3-cros64-reload.png /tmp/cp-4-directory.png'); 53 page.close();