diff options
| author | Adam Malczewski <[email protected]> | 2026-06-28 14:24:58 +0900 |
|---|---|---|
| committer | Adam Malczewski <[email protected]> | 2026-06-28 14:24:58 +0900 |
| commit | 841e776635d2a93371f302f0617e729626a69fe5 (patch) | |
| tree | c416925f6730a35f2560451ca7c6edaf41e8b1e4 /packages/ssh/src/pool.ts | |
| parent | 71c635f7d8ee01a2b23d5ddfdfc4bff043980052 (diff) | |
| parent | 414080e271ea44df0a7affc154b62e39b51a11a0 (diff) | |
| download | dispatch-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.ts | 18 |
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(); |
