import { createServer, type Server } from "node:http"; import { afterEach, expect, test } from "vitest"; import { waitForMetro } from "../e2e/global-setup"; class MetroPort { private response = { status: 500, body: "fallback" }; private constructor( readonly port: number, private readonly server: Server, ) {} static async listen(): Promise { let endpoint!: MetroPort; const server = createServer((_request, response) => { response.writeHead(endpoint.response.status, { "content-type": "text/plain" }); response.end(endpoint.response.body); }); await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); const address = server.address(); if (!address || typeof address === "string") { server.close(); throw new Error("Failed to listen for Metro readiness test"); } endpoint = new MetroPort(address.port, server); return endpoint; } serveMetro(): void { this.response = { status: 200, body: "packager-status:running" }; } async close(): Promise { await new Promise((resolve, reject) => { this.server.close((error) => { if (error) { reject(error); return; } resolve(); }); }); } } let endpoint: MetroPort | null = null; afterEach(async () => { await endpoint?.close(); endpoint = null; }); test("Metro readiness rejects another HTTP listener on the selected port", async () => { endpoint = await MetroPort.listen(); await expect(waitForMetro(endpoint.port, { label: "Metro", timeoutMs: 150 })).rejects.toThrow( "Expected Metro status", ); endpoint.serveMetro(); await expect(waitForMetro(endpoint.port, { label: "Metro", timeoutMs: 150 })).resolves.toBe( undefined, ); });