Files
ytplayer/tests/direct-transfer.spec.js

29 lines
2.1 KiB
JavaScript

const { test, expect } = require('@playwright/test');
for (const prepareDelay of [0, 12000]) test(`prepare delay ${prepareDelay}: paired pages save verified bytes directly over WebRTC with metadata-only server logs`, async ({ browser, request }) => {
const a = await browser.newContext(), b = await browser.newContext();
const sender = await a.newPage(), receiver = await b.newPage();
await sender.goto('/?id=sender'); await receiver.goto('/?id=receiver&prepareDelay=' + prepareDelay);
await sender.waitForFunction(() => window.ready); await receiver.waitForFunction(() => window.ready);
await receiver.evaluate(async () => {
const bytes = Uint8Array.from({ length: 2000000 }, (_, i) => i % 251), h = Sha256.create(); h.update(bytes);
const dir = await (await navigator.storage.getDirectory()).getDirectoryHandle('videos', { create: true });
const w = await (await dir.getFileHandle(`testvideo.${h.hex()}.direct.part`, { create: true })).createWritable();
await w.write(bytes.slice(0, 12345)); await w.close();
});
await sender.locator('#send').click();
await expect(receiver.getByRole('dialog')).toBeVisible();
expect(await receiver.evaluate(() => !!window.received)).toBe(false);
await receiver.getByRole('button', { name: 'Accept & save' }).click();
await receiver.waitForFunction(() => !!window.received);
const result = await receiver.evaluate(async () => {
const d = await (await navigator.storage.getDirectory()).getDirectoryHandle('videos');
const f = await (await d.getFileHandle('testvideo.mp4')).getFile();
const hash = Sha256.create(); hash.update(new Uint8Array(await f.arrayBuffer())); return { size: f.size, cid: hash.hex(), expected: window.received.cid };
});
expect(await receiver.evaluate(() => window.resumeOffsets)).toEqual([12345]);
expect(result.size).toBe(2000000); expect(result.cid).toBe(result.expected);
const logs = await (await request.get('/audit')).json();
expect(logs.every(x => !x.http && ['invite','accept','signal','complete'].includes(x.signalling))).toBe(true);
await a.close(); await b.close();
});