summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-06-18 14:11:33 -0400
committerDax Raad <[email protected]>2025-06-18 14:11:49 -0400
commitd4157d9a9603c099e650af4f6c369a56d3878179 (patch)
tree730ad3cc1d41ebf64b912e7e1922eda6fccf819f
parent6e4ef585d8fe1d7a7a969ad463526cec2732a3cb (diff)
downloadopencode-d4157d9a9603c099e650af4f6c369a56d3878179.tar.gz
opencode-d4157d9a9603c099e650af4f6c369a56d3878179.zip
ctrl+c should gracefully clean up pending sessions
-rw-r--r--packages/opencode/src/index.ts2
-rw-r--r--packages/opencode/src/session/index.ts39
2 files changed, 25 insertions, 16 deletions
diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts
index 63f1021d4..10de7fa57 100644
--- a/packages/opencode/src/index.ts
+++ b/packages/opencode/src/index.ts
@@ -101,7 +101,7 @@ const cli = yargs(hideBin(process.argv))
})()
await proc.exited
- await server.stop()
+ server.stop()
return "done"
})
diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts
index 61457c9db..2672d93db 100644
--- a/packages/opencode/src/session/index.ts
+++ b/packages/opencode/src/session/index.ts
@@ -73,15 +73,25 @@ export namespace Session {
),
}
- const state = App.state("session", () => {
- const sessions = new Map<string, Info>()
- const messages = new Map<string, Message.Info[]>()
-
- return {
- sessions,
- messages,
- }
- })
+ const state = App.state(
+ "session",
+ () => {
+ const sessions = new Map<string, Info>()
+ const messages = new Map<string, Message.Info[]>()
+ const pending = new Map<string, AbortController>()
+
+ return {
+ sessions,
+ messages,
+ pending,
+ }
+ },
+ async (state) => {
+ for (const [_, controller] of state.pending) {
+ controller.abort()
+ }
+ },
+ )
export async function create(parentID?: string) {
const result: Info = {
@@ -174,10 +184,10 @@ export namespace Session {
}
export function abort(sessionID: string) {
- const controller = pending.get(sessionID)
+ const controller = state().pending.get(sessionID)
if (!controller) return false
controller.abort()
- pending.delete(sessionID)
+ state().pending.delete(sessionID)
return true
}
@@ -737,17 +747,16 @@ export namespace Session {
await updateMessage(next)
}
- const pending = new Map<string, AbortController>()
function lock(sessionID: string) {
log.info("locking", { sessionID })
- if (pending.has(sessionID)) throw new BusyError(sessionID)
+ if (state().pending.has(sessionID)) throw new BusyError(sessionID)
const controller = new AbortController()
- pending.set(sessionID, controller)
+ state().pending.set(sessionID, controller)
return {
signal: controller.signal,
[Symbol.dispose]() {
log.info("unlocking", { sessionID })
- pending.delete(sessionID)
+ state().pending.delete(sessionID)
},
}
}