feat(app): make server sdk + sync state global (#29285)

This commit is contained in:
Brendan Allan 2026-05-26 08:20:57 +08:00 committed by GitHub
commit b0fcba5724
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 248 additions and 182 deletions

View file

@ -1,6 +1,8 @@
import { usePlatform } from "@/context/platform"
import type { ServerConnection } from "@/context/server"
import { ServerConnection } from "@/context/server"
import { createSdkForServer } from "./server"
import { Accessor, createEffect, onCleanup } from "solid-js"
import { createStore, reconcile } from "solid-js/store"
export type ServerHealth = { healthy: boolean; version?: string }
@ -92,6 +94,8 @@ export async function checkServerHealth(
return attempt(0).finally(() => timeout?.clear?.())
}
const pollMs = 10_000
export function useCheckServerHealth() {
const platform = usePlatform()
const fetcher = platform.fetch ?? globalThis.fetch
@ -111,3 +115,37 @@ export function useCheckServerHealth() {
return promise
}
}
export const useServerHealth = (servers: Accessor<ServerConnection.Any[]>, enabled: Accessor<boolean>) => {
const checkServerHealth = useCheckServerHealth()
const [status, setStatus] = createStore({} as Record<ServerConnection.Key, ServerHealth | undefined>)
createEffect(() => {
if (!enabled()) {
setStatus(reconcile({}))
return
}
const list = servers()
let dead = false
const refresh = async () => {
const results: Record<string, ServerHealth> = {}
await Promise.all(
list.map(async (conn) => {
results[ServerConnection.key(conn)] = await checkServerHealth(conn.http)
}),
)
if (dead) return
setStatus(reconcile(results))
}
void refresh()
const id = setInterval(() => void refresh(), pollMs)
onCleanup(() => {
dead = true
clearInterval(id)
})
})
return status
}