summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/utils/worktree.ts
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-27 14:51:34 -0600
committeradamelmore <[email protected]>2026-01-27 15:25:07 -0600
commit842f17d6d97c52d1efac66a8dca298f6ca692a56 (patch)
treefd45e06f014dc5a7e72e509bb46f4c3ec1fb444c /packages/app/src/utils/worktree.ts
parent1ebf63c70c552c95794325f40bbd278ba3e0c725 (diff)
downloadopencode-842f17d6d97c52d1efac66a8dca298f6ca692a56.tar.gz
opencode-842f17d6d97c52d1efac66a8dca298f6ca692a56.zip
perf(app): better memory management
Diffstat (limited to 'packages/app/src/utils/worktree.ts')
-rw-r--r--packages/app/src/utils/worktree.ts49
1 files changed, 32 insertions, 17 deletions
diff --git a/packages/app/src/utils/worktree.ts b/packages/app/src/utils/worktree.ts
index 7c0055920..581afd553 100644
--- a/packages/app/src/utils/worktree.ts
+++ b/packages/app/src/utils/worktree.ts
@@ -13,7 +13,21 @@ type State =
}
const state = new Map<string, State>()
-const waiters = new Map<string, Array<(state: State) => void>>()
+const waiters = new Map<
+ string,
+ {
+ promise: Promise<State>
+ resolve: (state: State) => void
+ }
+>()
+
+function deferred() {
+ const box = { resolve: (_: State) => {} }
+ const promise = new Promise<State>((resolve) => {
+ box.resolve = resolve
+ })
+ return { promise, resolve: box.resolve }
+}
export const Worktree = {
get(directory: string) {
@@ -27,32 +41,33 @@ export const Worktree = {
},
ready(directory: string) {
const key = normalize(directory)
- state.set(key, { status: "ready" })
- const list = waiters.get(key)
- if (!list) return
+ const next = { status: "ready" } as const
+ state.set(key, next)
+ const waiter = waiters.get(key)
+ if (!waiter) return
waiters.delete(key)
- for (const fn of list) fn({ status: "ready" })
+ waiter.resolve(next)
},
failed(directory: string, message: string) {
const key = normalize(directory)
- state.set(key, { status: "failed", message })
- const list = waiters.get(key)
- if (!list) return
+ const next = { status: "failed", message } as const
+ state.set(key, next)
+ const waiter = waiters.get(key)
+ if (!waiter) return
waiters.delete(key)
- for (const fn of list) fn({ status: "failed", message })
+ waiter.resolve(next)
},
wait(directory: string) {
const key = normalize(directory)
const current = state.get(key)
if (current && current.status !== "pending") return Promise.resolve(current)
- return new Promise<State>((resolve) => {
- const list = waiters.get(key)
- if (!list) {
- waiters.set(key, [resolve])
- return
- }
- list.push(resolve)
- })
+ const existing = waiters.get(key)
+ if (existing) return existing.promise
+
+ const waiter = deferred()
+
+ waiters.set(key, waiter)
+ return waiter.promise
},
}