summaryrefslogtreecommitdiffhomepage
path: root/packages/ssh/src/pool.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-28 14:24:58 +0900
committerAdam Malczewski <[email protected]>2026-06-28 14:24:58 +0900
commit841e776635d2a93371f302f0617e729626a69fe5 (patch)
treec416925f6730a35f2560451ca7c6edaf41e8b1e4 /packages/ssh/src/pool.ts
parent71c635f7d8ee01a2b23d5ddfdfc4bff043980052 (diff)
parent414080e271ea44df0a7affc154b62e39b51a11a0 (diff)
downloaddispatch-841e776635d2a93371f302f0617e729626a69fe5.tar.gz
dispatch-841e776635d2a93371f302f0617e729626a69fe5.zip
Merge branch 'dev' into feature/workspace-star
Diffstat (limited to 'packages/ssh/src/pool.ts')
-rw-r--r--packages/ssh/src/pool.ts18
1 files changed, 18 insertions, 0 deletions
diff --git a/packages/ssh/src/pool.ts b/packages/ssh/src/pool.ts
index 9acae0e..5d1eedd 100644
--- a/packages/ssh/src/pool.ts
+++ b/packages/ssh/src/pool.ts
@@ -112,6 +112,24 @@ export function createSshConnectionPool(deps: SshPoolDeps): SshConnectionPool {
let sftp: import("ssh2").SFTPWrapper | null = null;
let connectPromise: Promise<void> | null = null;
+ // Permanent error listener — without it, a post-connect ssh2 'error'
+ // (re-key/keepalive timeout) escapes uncaught → process crash. cleanup()
+ // in doConnect only removes the connect-time onReady/onError; this persists.
+ client.on("error", (err: unknown) => {
+ const from = state.value;
+ state.value = "error";
+ state.error = err instanceof Error ? err.message : String(err);
+ connectPromise = null;
+ deps.logger.error("ssh: pooled client error", {
+ err,
+ alias,
+ message: state.error,
+ level: (err as { level?: string } | null)?.level,
+ from,
+ to: "error",
+ });
+ });
+
const touch = (): void => {
const e = entries.get(alias);
if (e !== undefined) e.lastUsedAt = Date.now();