refactor(test): share gateway server start helper

This commit is contained in:
Peter Steinberger
2026-02-15 23:02:27 +00:00
parent 1b455b6d9f
commit 99909f7bc7
4 changed files with 175 additions and 169 deletions

View File

@@ -331,6 +331,43 @@ export async function startGatewayServer(port: number, opts?: GatewayServerOptio
return await mod.startGatewayServer(port, resolvedOpts);
}
async function startGatewayServerWithRetries(params: {
port: number;
opts?: GatewayServerOptions;
}): Promise<{ port: number; server: Awaited<ReturnType<typeof startGatewayServer>> }> {
let port = params.port;
for (let attempt = 0; attempt < 10; attempt++) {
try {
return {
port,
server: await startGatewayServer(port, params.opts),
};
} catch (err) {
const code = (err as { cause?: { code?: string } }).cause?.code;
if (code !== "EADDRINUSE") {
throw err;
}
port = await getFreePort();
}
}
throw new Error("failed to start gateway server after retries");
}
export async function withGatewayServer<T>(
fn: (ctx: { port: number; server: Awaited<ReturnType<typeof startGatewayServer>> }) => Promise<T>,
opts?: { port?: number; serverOptions?: GatewayServerOptions },
): Promise<T> {
const started = await startGatewayServerWithRetries({
port: opts?.port ?? (await getFreePort()),
opts: opts?.serverOptions,
});
try {
return await fn({ port: started.port, server: started.server });
} finally {
await started.server.close();
}
}
export async function startServerWithClient(
token?: string,
opts?: GatewayServerOptions & { wsHeaders?: Record<string, string> },
@@ -352,22 +389,9 @@ export async function startServerWithClient(
process.env.OPENCLAW_GATEWAY_TOKEN = fallbackToken;
}
let server: Awaited<ReturnType<typeof startGatewayServer>> | null = null;
for (let attempt = 0; attempt < 10; attempt++) {
try {
server = await startGatewayServer(port, gatewayOpts);
break;
} catch (err) {
const code = (err as { cause?: { code?: string } }).cause?.code;
if (code !== "EADDRINUSE") {
throw err;
}
port = await getFreePort();
}
}
if (!server) {
throw new Error("failed to start gateway server after retries");
}
const started = await startGatewayServerWithRetries({ port, opts: gatewayOpts });
port = started.port;
const server = started.server;
const ws = new WebSocket(
`ws://127.0.0.1:${port}`,