fix(pty): detach cancellation before close drain

This commit is contained in:
Tianyi Cui
2026-07-29 08:00:08 +08:00
parent 6e5d711099
commit a95e01d8b0
2 changed files with 26 additions and 1 deletions
@@ -954,4 +954,26 @@ describe('LocalPtySession bounds, signals, and teardown', () => {
expect((await operation.done).waitReason).toBe('session_exit')
})
it('detaches active cancellation before draining terminal operations', async () => {
vi.useFakeTimers()
const terminal = new FakeTerminal()
const session = new LocalPtySession(terminal, config())
await initialize(session, terminal)
const inspection = Promise.withResolvers<{ processGroupId: number; inputWaiting: boolean }>()
terminal.inspectForeground = async () => await inspection.promise
const signalForeground = vi.spyOn(terminal, 'signalForeground')
const controller = new AbortController()
const operation = session.startSend({ text: 'pending inspection', submit: true, signal: controller.signal })
const closing = session.close('pending cancellation')
await Promise.resolve()
await Promise.resolve()
controller.abort('late cancellation')
expect(signalForeground).not.toHaveBeenCalled()
inspection.resolve({ processGroupId: 456, inputWaiting: false })
await closing
expect((await operation.done).waitReason).toBe('session_exit')
})
})