import { serve, type CommandChild } from "./cli" import { DEFAULT_SERVER_URL_KEY, WSL_ENABLED_KEY } from "./constants" import { store } from "./store" export type WslConfig = { enabled: boolean } export type HealthCheck = { wait: Promise } export function getDefaultServerUrl(): string | null { const value = store.get(DEFAULT_SERVER_URL_KEY) return typeof value === "string" ? value : null } export function setDefaultServerUrl(url: string | null) { if (url) { store.set(DEFAULT_SERVER_URL_KEY, url) return } store.delete(DEFAULT_SERVER_URL_KEY) } export function getWslConfig(): WslConfig { const value = store.get(WSL_ENABLED_KEY) return { enabled: typeof value === "boolean" ? value : false } } export function setWslConfig(config: WslConfig) { store.set(WSL_ENABLED_KEY, config.enabled) } export function spawnLocalServer(hostname: string, port: number, password: string) { const { child, exit, events } = serve(hostname, port, password) const wait = (async () => { const url = `http://${hostname}:${port}` const ready = async () => { while (true) { await new Promise((resolve) => setTimeout(resolve, 100)) if (await checkHealth(url, password)) return } } const terminated = async () => { const payload = await exit throw new Error( `Sidecar terminated before becoming healthy (code=${payload.code ?? "unknown"} signal=${ payload.signal ?? "unknown" })`, ) } await Promise.race([ready(), terminated()]) })() return { child, health: { wait }, events } } export async function checkHealth(url: string, password?: string | null): Promise { let healthUrl: URL try { healthUrl = new URL("/global/health", url) } catch { return false } const headers = new Headers() if (password) { const auth = Buffer.from(`opencode:${password}`).toString("base64") headers.set("authorization", `Basic ${auth}`) } try { const res = await fetch(healthUrl, { method: "GET", headers, signal: AbortSignal.timeout(3000), }) return res.ok } catch { return false } } export type { CommandChild }