53 lines
3.0 KiB
JavaScript
53 lines
3.0 KiB
JavaScript
// 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();
|