diff options
| author | Adam <[email protected]> | 2026-01-06 08:18:17 -0600 |
|---|---|---|
| committer | Adam <[email protected]> | 2026-01-06 08:19:17 -0600 |
| commit | b88bcd49fdea0955f2efc8f09a3614c188d22107 (patch) | |
| tree | 8ab04d7a9d2b892cd884eab5ab3bb5da9187191a /packages/app/src/context | |
| parent | 3f463bc9168abd907be9ae582e161ff89c3a27c9 (diff) | |
| download | opencode-b88bcd49fdea0955f2efc8f09a3614c188d22107.tar.gz opencode-b88bcd49fdea0955f2efc8f09a3614c188d22107.zip | |
fix(app): code splitting for web load perf gains
Diffstat (limited to 'packages/app/src/context')
| -rw-r--r-- | packages/app/src/context/command.tsx | 13 | ||||
| -rw-r--r-- | packages/app/src/context/server.tsx | 62 |
2 files changed, 54 insertions, 21 deletions
diff --git a/packages/app/src/context/command.tsx b/packages/app/src/context/command.tsx index efd83bec8..7f88b74c8 100644 --- a/packages/app/src/context/command.tsx +++ b/packages/app/src/context/command.tsx @@ -177,8 +177,19 @@ export const { use: useCommand, provider: CommandProvider } = createSimpleContex const dialog = useDialog() const options = createMemo(() => { - const all = registrations().flatMap((x) => x()) + const seen = new Set<string>() + const all: CommandOption[] = [] + + for (const reg of registrations()) { + for (const opt of reg()) { + if (seen.has(opt.id)) continue + seen.add(opt.id) + all.push(opt) + } + } + const suggested = all.filter((x) => x.suggested && !x.disabled) + return [ ...suggested.map((x) => ({ ...x, diff --git a/packages/app/src/context/server.tsx b/packages/app/src/context/server.tsx index beb00be87..48e7e99cc 100644 --- a/packages/app/src/context/server.tsx +++ b/packages/app/src/context/server.tsx @@ -1,6 +1,6 @@ import { createOpencodeClient } from "@opencode-ai/sdk/v2/client" import { createSimpleContext } from "@opencode-ai/ui/context" -import { batch, createEffect, createMemo, createResource, createSignal, onCleanup } from "solid-js" +import { batch, createEffect, createMemo, createSignal, onCleanup } from "solid-js" import { createStore } from "solid-js/store" import { usePlatform } from "@/context/platform" import { persisted } from "@/utils/persist" @@ -91,27 +91,49 @@ export const { use: useServer, provider: ServerProvider } = createSimpleContext( const isReady = createMemo(() => ready() && !!active()) - const [healthy, { refetch }] = createResource( - () => active() || undefined, - async (url) => { - if (!url) return - - const sdk = createOpencodeClient({ - baseUrl: url, - fetch: platform.fetch, - signal: AbortSignal.timeout(3000), - }) - return sdk.global - .health() - .then((x) => x.data?.healthy === true) - .catch(() => false) - }, - ) + const [healthy, setHealthy] = createSignal<boolean | undefined>(undefined) + + const check = (url: string) => { + const sdk = createOpencodeClient({ + baseUrl: url, + fetch: platform.fetch, + signal: AbortSignal.timeout(3000), + }) + return sdk.global + .health() + .then((x) => x.data?.healthy === true) + .catch(() => false) + } createEffect(() => { - if (!active()) return - const interval = setInterval(() => refetch(), 10_000) - onCleanup(() => clearInterval(interval)) + const url = active() + if (!url) return + + setHealthy(undefined) + + let alive = true + let busy = false + + const run = () => { + if (busy) return + busy = true + void check(url) + .then((next) => { + if (!alive) return + setHealthy(next) + }) + .finally(() => { + busy = false + }) + } + + run() + const interval = setInterval(run, 10_000) + + onCleanup(() => { + alive = false + clearInterval(interval) + }) }) const origin = createMemo(() => projectsKey(active())) |
