fix(terminal): make SSE cleanup idempotent (#1234)

Co-authored-by: Isaac Sanchez <isanchez-hawkins@arize.com>
This commit is contained in:
Isaac Sanchez-Hawkins
2026-05-12 11:01:47 +03:00
committed by GitHub
co-authored by Isaac Sanchez
parent 060a5311ef
commit df12c3a2b5
+36 -21
View File
@@ -572,6 +572,34 @@ export function createTerminalRuntime({
}
}, 15000);
let cleanedUp = false;
let dataDisposable = null;
let exitDisposable = null;
const cleanup = () => {
if (cleanedUp) {
return;
}
cleanedUp = true;
clearInterval(heartbeatInterval);
session.clients.delete(clientId);
if (dataDisposable && typeof dataDisposable.dispose === 'function') {
dataDisposable.dispose();
}
if (exitDisposable && typeof exitDisposable.dispose === 'function') {
exitDisposable.dispose();
}
try {
res.end();
} catch (error) {
}
console.log(`Client ${clientId} disconnected from terminal session ${sessionId}`);
};
const dataHandler = (data) => {
try {
session.lastActivity = Date.now();
@@ -600,28 +628,15 @@ export function createTerminalRuntime({
cleanup();
};
const dataDisposable = session.ptyProcess.onData(dataHandler);
const exitDisposable = session.ptyProcess.onExit(exitHandler);
dataDisposable = session.ptyProcess.onData(dataHandler);
if (cleanedUp && dataDisposable && typeof dataDisposable.dispose === 'function') {
dataDisposable.dispose();
}
const cleanup = () => {
clearInterval(heartbeatInterval);
session.clients.delete(clientId);
if (dataDisposable && typeof dataDisposable.dispose === 'function') {
dataDisposable.dispose();
}
if (exitDisposable && typeof exitDisposable.dispose === 'function') {
exitDisposable.dispose();
}
try {
res.end();
} catch (error) {
}
console.log(`Client ${clientId} disconnected from terminal session ${sessionId}`);
};
exitDisposable = session.ptyProcess.onExit(exitHandler);
if (cleanedUp && exitDisposable && typeof exitDisposable.dispose === 'function') {
exitDisposable.dispose();
}
req.on('close', cleanup);
req.on('error', cleanup);