| 1234567891011121314151617181920212223242526272829303132333435 |
- 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"
- }
|