summaryrefslogtreecommitdiffhomepage
path: root/packages/ssh/src/pool.ts
diff options
context:
space:
mode:
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();