summaryrefslogtreecommitdiffhomepage
path: root/packages/ssh/src/pool.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-28 14:26:07 +0900
committerAdam Malczewski <[email protected]>2026-06-28 14:31:12 +0900
commitdf7d45b58076b6ab47bea3148872cac11401d510 (patch)
tree8c3da2f50f063f0b491d595550bd755564013745 /packages/ssh/src/pool.ts
parent2d276669a0cb41959fc67d17bc58e77853dc3eb5 (diff)
parent414080e271ea44df0a7affc154b62e39b51a11a0 (diff)
downloaddispatch-df7d45b58076b6ab47bea3148872cac11401d510.tar.gz
dispatch-df7d45b58076b6ab47bea3148872cac11401d510.zip
Merge branch 'dev' into feature/concurrency-fixes
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();