Cancel WriteBuffer innerWrite timers on dispose

Guard _innerWrite and public write methods after disposal so pending
setTimeout continuations cannot run against a disposed terminal.

Fixes #5936

Co-authored-by: Daniel Imms <Tyriar@users.noreply.github.com>
This commit is contained in:
Cursor Agent
2026-05-27 18:18:22 +00:00
co-authored by Daniel Imms
parent 2ab0f10a26
commit d91045dc5f
2 changed files with 75 additions and 7 deletions
+29
View File
@@ -140,5 +140,34 @@ describe('WriteBuffer', () => {
wb.flushSync();
assert.equal(parsed, 0);
});
it('dispose cancels scheduled innerWrite', done => {
wb.write('a');
wb.dispose();
setTimeout(() => {
assert.deepEqual(stack, []);
done();
}, 20);
});
it('dispose does not fire onWriteParsed for pending writes', done => {
let parsed = 0;
wb.onWriteParsed(() => parsed++);
wb.write('a');
wb.dispose();
setTimeout(() => {
assert.equal(parsed, 0);
done();
}, 20);
});
it('write after dispose is a no-op', done => {
wb.dispose();
wb.write('a', () => {
assert.deepEqual(stack, []);
done();
});
setTimeout(() => {
assert.deepEqual(stack, []);
done();
}, 20);
});
});
});