// Plan 017 harness check: device A holds a file; device B downloads it over WebRTC. import { chromium } from 'playwright'; const b = await chromium.launch({ executablePath: process.env.CHROMIUM || '/opt/pw-browsers/chromium-1194/chrome-linux/chrome', args: ['--disable-features=WebRtcHideLocalIpsWithMdns'], }); const pages = []; for (let i = 0; i < 2; i++) { const ctx = await b.newContext(); const p = await ctx.newPage(); p.on('console', (m) => { if (m.type() === 'error') console.log('console', i, m.text()); }); await p.goto('http://localhost:8770/'); pages.push(p); } const setup = (p) => p.evaluate(async () => { P2PClient.start({ getSettings: () => ({}) }); await P2PClient.sync(); for (let i = 0; i < 50 && !P2PClient.isConnected(); i++) await new Promise((r) => setTimeout(r, 100)); P2PTransfer.start({ iceServers: [] }); return P2PClient.peer(); }); // Holder: write a 5 MB file + registry record. const held = await pages[0].evaluate(async () => { const bytes = new Uint8Array(5 * 1024 * 1024 + 777).map((_, i) => (i * 31 + 7) % 256); const dir = await (await navigator.storage.getDirectory()).getDirectoryHandle('videos', { create: true }); const w = await (await dir.getFileHandle('heldAAAAAAA.mp4', { create: true })).createWritable(); await w.write(bytes); await w.close(); const cid = Sha256.hex(bytes); await DeviceDB.putFile({ videoId: 'heldAAAAAAA', cid, size: bytes.length, state: 'verified' }); return { cid, size: bytes.length }; }); const peerA = await setup(pages[0]); await setup(pages[1]); const t0 = Date.now(); const res = await pages[1].evaluate(async ({ peerA, held }) => { const good = await P2PTransfer.download({ videoId: 'gotAAAAAAAA', cid: held.cid, size: held.size, peers: [{ peer: peerA }] }); const list = (await OPFS.listVideos()).map((x) => [x.id, x.size]); const bad = await P2PTransfer.download({ videoId: 'badAAAAAAAA', cid: 'f'.repeat(64), size: held.size, peers: [{ peer: peerA }] }); const list2 = (await OPFS.listVideos()).map((x) => x.id); return { good, list, bad, list2 }; }, { peerA, held }); // Holder's file gets corrupted (same size, one byte flipped) but its record still claims the cid. await pages[0].evaluate(async () => { const dir = await (await navigator.storage.getDirectory()).getDirectoryHandle('videos'); const fh = await dir.getFileHandle('heldAAAAAAA.mp4'); const bytes = new Uint8Array(await (await fh.getFile()).arrayBuffer()); bytes[12345] ^= 0xff; const w = await fh.createWritable(); await w.write(bytes); await w.close(); }); res.corrupt = await pages[1].evaluate(async ({ peerA, held }) => { const r = await P2PTransfer.download({ videoId: 'corAAAAAAAA', cid: held.cid, size: held.size, peers: [{ peer: peerA }] }); await new Promise((x) => setTimeout(x, 300)); const names = []; for await (const [n] of (await (await navigator.storage.getDirectory()).getDirectoryHandle('videos')).entries()) names.push(n); return { r, names: names.sort() }; }, { peerA, held }); console.log(JSON.stringify({ ...res, ms: Date.now() - t0 })); await b.close();