also looking at this
test: label native browser transport failures
#66
7 files
+177
-11
| @@ -0,0 +1,38 @@ | ||
| 1 | import assert from 'node:assert/strict' | |
| 2 | import { writeFile } from 'node:fs/promises' | |
| 3 | import { basename, join } from 'node:path' | |
| 4 | ||
| 5 | // Controlled external HTTP/WebSocket peer, not a Chrome implementation. | |
| 6 | const root = process.cwd(), mode = process.env.BROWSER_PEER_MODE | |
| 7 | assert(basename(root).startsWith('drone-incident-access-browser-operation-')) | |
| 8 | assert(['version-fetch', 'version-json', 'target-fetch', 'target-json', 'browser-socket', 'page-socket', 'control-fetch', 'control-json', 'control-ok', 'ok'].includes(mode!)) | |
| 9 | const profile = Bun.argv.find(value => value.startsWith('--user-data-dir='))?.slice('--user-data-dir='.length) | |
| 10 | assert.equal(profile, join(root, 'browser-profile')) | |
| 11 | const stalledBody = () => new Response(new ReadableStream({ start(controller) { controller.enqueue(new TextEncoder().encode('{')) } }), { headers: { 'content-type': 'application/json' } }) | |
| 12 | const server = Bun.serve({ | |
| 13 | hostname: '127.0.0.1', port: 0, | |
| 14 | fetch(request, owner): Response | Promise<Response> | undefined { | |
| 15 | const path = new URL(request.url).pathname | |
| 16 | if (path === '/browser' || path === '/page') { | |
| 17 | if ((path === '/browser' && mode === 'browser-socket') || (path === '/page' && mode === 'page-socket')) return new Promise<Response>(() => {}) | |
| 18 | assert(owner.upgrade(request)); return | |
| 19 | } | |
| 20 | if (path === '/__fixture/status') { | |
| 21 | assert.equal(request.headers.get('x-fixture-control'), 'synthetic-peer-control') | |
| 22 | if (mode === 'control-fetch') return new Promise<Response>(() => {}) | |
| 23 | if (mode === 'control-json') return stalledBody() | |
| 24 | return Response.json({ ok: true }) | |
| 25 | } | |
| 26 | if (path === '/json/version' || path === '/json/new') { | |
| 27 | const operation = path === '/json/version' ? 'version' : 'target' | |
| 28 | if (mode === `${operation}-fetch`) return new Promise<Response>(() => {}) | |
| 29 | if (mode === `${operation}-json`) return stalledBody() | |
| 30 | return Response.json({ webSocketDebuggerUrl: `ws://127.0.0.1:${server.port}/${operation === 'version' ? 'browser' : 'page'}` }) | |
| 31 | } | |
| 32 | return new Response(null, { status: 404 }) | |
| 33 | }, | |
| 34 | websocket: { message() {} }, | |
| 35 | }) | |
| 36 | process.on('SIGTERM', () => { void server.stop(true).then(() => process.exit(0)) }) | |
| 37 | await writeFile(join(root, 'peer.pid'), String(process.pid), { mode: 0o600, flag: 'wx' }) | |
| 38 | await writeFile(join(profile!, 'DevToolsActivePort'), `${server.port}\n/browser\n`, { mode: 0o600, flag: 'wx' }) | |