diff --git a/src/app/ssh/SshClient.tsx b/src/app/ssh/SshClient.tsx index bb20ba964..6a3f9c76c 100644 --- a/src/app/ssh/SshClient.tsx +++ b/src/app/ssh/SshClient.tsx @@ -122,6 +122,9 @@ export default function SshClient({ const [connected, setConnected] = useState(false); const [connecting, setConnecting] = useState(false); const [connectError, setConnectError] = useState(null); + const [sessionClosedCode, setSessionClosedCode] = useState( + null + ); const terminalRef = useRef(null); const xtermRef = useRef(null); @@ -222,6 +225,8 @@ export default function SshClient({ authMethod: AuthTab = "password" ) { setConnecting(true); + setSessionClosedCode(null); + setConnectError(null); if (!target) { setConnectError(t("sshErrorNoTarget")); @@ -257,8 +262,10 @@ export default function SshClient({ let authConfirmed = false; let authErrorShown = false; + let socketOpened = false; ws.onopen = () => { + socketOpened = true; ws.send( JSON.stringify({ type: "auth", @@ -331,13 +338,18 @@ export default function SshClient({ }; ws.onclose = (evt) => { + wsRef.current = null; setConnecting(false); + const isCleanClose = evt.wasClean || evt.code === 1000; + if (isCleanClose && (authConfirmed || socketOpened)) { + xtermRef.current?.dispose(); + xtermRef.current = null; + setConnected(false); + setSessionClosedCode(evt.code); + return; + } if (authConfirmed) { setConnected(false); - if (evt.wasClean || evt.code === 1000) { - window.close(); - return; - } xtermRef.current?.writeln( `\r\n\x1b[33m${t("sshConnectionClosedCode", { code: evt.code })}\x1b[0m\r\n` ); @@ -457,6 +469,40 @@ export default function SshClient({ ); } + if (sessionClosedCode !== null) { + return ( + + + + + {t("sshTitle")} + + {t("sshConnectionClosedCode", { + code: sessionClosedCode + })} + + + + + + This session has ended. You can close this tab + now. + + + + + + + + ); + } + return ( <> {!connected && (