import { createServer } from 'node:http' import type { AddressInfo } from 'node:net' /** Serves a `Request → Response` handler over a real socket (test helper). */ export async function serve(handle: (request: Request) => Promise): Promise<{ url: string; close: () => Promise }> { const server = createServer(async (req, res) => { const chunks: Buffer[] = [] for await (const chunk of req) chunks.push(chunk as Buffer) const response = await handle( new Request(`http://localhost${req.url}`, { method: req.method, headers: Object.entries(req.headers).flatMap(([name, value]) => (typeof value === 'string' ? [[name, value] as [string, string]] : [])), body: req.method === 'POST' ? Buffer.concat(chunks) : undefined, }), ) res.writeHead(response.status, Object.fromEntries(response.headers)) if (!response.body) return void res.end() const reader = response.body.getReader() res.on('close', () => void reader.cancel().catch(() => {})) for (let next = await reader.read(); !next.done; next = await reader.read()) res.write(next.value) res.end() }) await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) return { url: `http://127.0.0.1:${(server.address() as AddressInfo).port}`, close: () => new Promise((resolve) => (server.closeAllConnections(), server.close(() => resolve()))), } }