diff options
| author | Dax Raad <[email protected]> | 2025-06-18 14:11:33 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-06-18 14:11:49 -0400 |
| commit | d4157d9a9603c099e650af4f6c369a56d3878179 (patch) | |
| tree | 730ad3cc1d41ebf64b912e7e1922eda6fccf819f | |
| parent | 6e4ef585d8fe1d7a7a969ad463526cec2732a3cb (diff) | |
| download | opencode-d4157d9a9603c099e650af4f6c369a56d3878179.tar.gz opencode-d4157d9a9603c099e650af4f6c369a56d3878179.zip | |
ctrl+c should gracefully clean up pending sessions
| -rw-r--r-- | packages/opencode/src/index.ts | 2 | ||||
| -rw-r--r-- | packages/opencode/src/session/index.ts | 39 |
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) }, } } |
