Add WebSocket and SSH keepalives so idle dashboard terminal sessions stay connected across proxies and long-running idle periods. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -122,6 +122,7 @@
|
||||
if (d) {
|
||||
d.voice?.destroy();
|
||||
d.ro?.disconnect();
|
||||
if (d.heartbeat) clearInterval(d.heartbeat);
|
||||
d.term?.element?.removeEventListener("dragover", d.handleDragOver);
|
||||
d.term?.element?.removeEventListener("drop", d.handleDrop);
|
||||
d.term?.textarea?.removeEventListener("paste", d.handlePaste);
|
||||
@@ -180,6 +181,10 @@
|
||||
ws.onerror = () => updateTab(tabId, { connected: false, error: "Connection failed" });
|
||||
term.onData((data) => ws.readyState === 1 && ws.send(new TextEncoder().encode(data)));
|
||||
|
||||
const heartbeat = setInterval(() => {
|
||||
if (ws.readyState === 1) ws.send("__ping__");
|
||||
}, 25000);
|
||||
|
||||
const handleDragOver = (e) => {
|
||||
e.preventDefault();
|
||||
};
|
||||
@@ -211,7 +216,7 @@
|
||||
ro.observe(el);
|
||||
const voice = new VoiceSession(() => { voiceTick++; });
|
||||
voice.attach(term, ws);
|
||||
tabData.set(tabId, { ws, term, ro, el, voice, handleDragOver, handleDrop, handlePaste });
|
||||
tabData.set(tabId, { ws, term, ro, el, voice, heartbeat, handleDragOver, handleDrop, handlePaste });
|
||||
})();
|
||||
}
|
||||
|
||||
@@ -222,6 +227,7 @@
|
||||
tabData.forEach((d) => {
|
||||
d.voice?.destroy();
|
||||
d.ro?.disconnect();
|
||||
if (d.heartbeat) clearInterval(d.heartbeat);
|
||||
d.term?.element?.removeEventListener("dragover", d.handleDragOver);
|
||||
d.term?.element?.removeEventListener("drop", d.handleDrop);
|
||||
d.term?.textarea?.removeEventListener("paste", d.handlePaste);
|
||||
|
||||
Reference in New Issue
Block a user