Skip to content

Commit d4157d9

Browse files
committed
ctrl+c should gracefully clean up pending sessions
1 parent 6e4ef58 commit d4157d9

File tree

2 files changed

+25
-16
lines changed

2 files changed

+25
-16
lines changed

packages/opencode/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ const cli = yargs(hideBin(process.argv))
101101
})()
102102

103103
await proc.exited
104-
await server.stop()
104+
server.stop()
105105

106106
return "done"
107107
})

packages/opencode/src/session/index.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,25 @@ export namespace Session {
7373
),
7474
}
7575

76-
const state = App.state("session", () => {
77-
const sessions = new Map<string, Info>()
78-
const messages = new Map<string, Message.Info[]>()
79-
80-
return {
81-
sessions,
82-
messages,
83-
}
84-
})
76+
const state = App.state(
77+
"session",
78+
() => {
79+
const sessions = new Map<string, Info>()
80+
const messages = new Map<string, Message.Info[]>()
81+
const pending = new Map<string, AbortController>()
82+
83+
return {
84+
sessions,
85+
messages,
86+
pending,
87+
}
88+
},
89+
async (state) => {
90+
for (const [_, controller] of state.pending) {
91+
controller.abort()
92+
}
93+
},
94+
)
8595

8696
export async function create(parentID?: string) {
8797
const result: Info = {
@@ -174,10 +184,10 @@ export namespace Session {
174184
}
175185

176186
export function abort(sessionID: string) {
177-
const controller = pending.get(sessionID)
187+
const controller = state().pending.get(sessionID)
178188
if (!controller) return false
179189
controller.abort()
180-
pending.delete(sessionID)
190+
state().pending.delete(sessionID)
181191
return true
182192
}
183193

@@ -737,17 +747,16 @@ export namespace Session {
737747
await updateMessage(next)
738748
}
739749

740-
const pending = new Map<string, AbortController>()
741750
function lock(sessionID: string) {
742751
log.info("locking", { sessionID })
743-
if (pending.has(sessionID)) throw new BusyError(sessionID)
752+
if (state().pending.has(sessionID)) throw new BusyError(sessionID)
744753
const controller = new AbortController()
745-
pending.set(sessionID, controller)
754+
state().pending.set(sessionID, controller)
746755
return {
747756
signal: controller.signal,
748757
[Symbol.dispose]() {
749758
log.info("unlocking", { sessionID })
750-
pending.delete(sessionID)
759+
state().pending.delete(sessionID)
751760
},
752761
}
753762
}

0 commit comments

Comments
 (0)