import { readGatewayAuthToken } from "../server/authToken.js";
import { createRemoteGateway, RemoteGateway } from "./RemoteGateway.js";
export type ProbeGatewayServerOptions = {
url?: string;
token?: string;
timeoutMs?: number;
};
export async function probeGatewayServer(options: ProbeGatewayServerOptions = {}): Promise<{
ok: boolean;
url: string;
wsUrl: string;
token?: string;
}> {
const url = options.url ?? "http://127.0.0.1:18789";
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 200);
try {
const response = await fetch(`${url}/health`, { signal: controller.signal });
if (!response.ok) {
return { ok: false, url, wsUrl: toWsUrl(url) };
}
const token = options.token ?? (await readGatewayAuthToken());
return { ok: Boolean(token), url, wsUrl: toWsUrl(url), token };
} catch {
return { ok: false, url, wsUrl: toWsUrl(url) };
} finally {
clearTimeout(timeout);
}
}
export async function connectRemoteGatewayIfAvailable(
options: ProbeGatewayServerOptions = {},
): Promise<RemoteGateway | undefined> {
const probe = await probeGatewayServer(options);
if (!probe.ok || !probe.token) {
return undefined;
}
try {
return await createRemoteGateway({ url: probe.wsUrl, token: probe.token, clientName: "cli" });
} catch {
return undefined;
}
}
function toWsUrl(url: string): string {
const parsed = new URL(url);
parsed.protocol = parsed.protocol === "https:" ? "wss:" : "ws:";
parsed.pathname = "/ws";
return parsed.toString();
}