mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-25 02:03:37 +00:00
35 lines
1.4 KiB
TypeScript
35 lines
1.4 KiB
TypeScript
import type { ServerConnection } from "@/context/server"
|
|
import { authTokenFromCredentials } from "./server"
|
|
|
|
export type ServerProtocol = "v1" | "v2"
|
|
|
|
function headers(server: ServerConnection.HttpBase) {
|
|
if (!server.password) return
|
|
return {
|
|
Authorization: `Basic ${authTokenFromCredentials({ username: server.username, password: server.password })}`,
|
|
}
|
|
}
|
|
|
|
async function probe(server: ServerConnection.HttpBase, fetch: typeof globalThis.fetch, path: string) {
|
|
const response = await fetch(new URL(path, server.url), {
|
|
headers: headers(server),
|
|
signal: AbortSignal.timeout(5_000),
|
|
})
|
|
if (!response.ok || !response.headers.get("content-type")?.includes("application/json")) return
|
|
const value: unknown = await response.json()
|
|
if (!value || typeof value !== "object") return
|
|
return value
|
|
}
|
|
|
|
export async function detectServerProtocol(
|
|
server: ServerConnection.HttpBase,
|
|
fetch: typeof globalThis.fetch,
|
|
): Promise<ServerProtocol> {
|
|
const legacy = await probe(server, fetch, "/global/health").catch(() => undefined)
|
|
if (legacy && "healthy" in legacy && legacy.healthy === true) return "v1"
|
|
|
|
const current = await probe(server, fetch, "/api/health").catch(() => undefined)
|
|
if (current && "pid" in current && typeof current.pid === "number") return "v2"
|
|
if (current && "healthy" in current && current.healthy === true) return "v1"
|
|
return "v2"
|
|
}
|