Self-hosted SSH + SFTP + RDP in a browser — MobaXterm replacement
Go to file
Vantz Stockwell 8c431d3d12 fix: SSH input deadlock — output loop held channel mutex across await
Root cause: The output reader loop held Arc<TokioMutex<Channel>> while
calling ch.wait().await. After the initial prompt rendered and the server
went idle, wait() blocked indefinitely holding the lock. ssh_write()
could never acquire the mutex to send keystrokes. Permanent deadlock.

Fix: Separated read/write paths. The output loop now owns the Channel
exclusively via tokio::select!, receiving resize/shutdown commands through
an mpsc channel. Writes go through Handle::data(channel_id, data) which
bypasses the Channel entirely — no shared mutex, no deadlock.

Also killed all compiler warnings (unused imports in rdp module).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-24 18:28:09 -04:00
.gitea/workflows fix: attach installer .exe to Gitea release as downloadable asset 2026-03-24 16:48:01 -04:00
docs docs: Phase 7 complete — CLAUDE.md + Go migration checklist 2026-03-17 16:48:36 -04:00
src feat: RDP clipboard paste, keyboard grab default ON, frame dirty flag 2026-03-24 17:57:16 -04:00
src-tauri fix: SSH input deadlock — output loop held channel mutex across await 2026-03-24 18:28:09 -04:00
.gitignore chore: add .gitignore, remove node_modules and target from tracking 2026-03-17 15:10:00 -04:00
CLAUDE.md docs: Phase 7 complete — CLAUDE.md + Go migration checklist 2026-03-17 16:48:36 -04:00
index.html feat: Phase 1 complete — Tauri v2 foundation 2026-03-17 15:09:41 -04:00
package-lock.json feat: Phase 1 complete — Tauri v2 foundation 2026-03-17 15:09:41 -04:00
package.json feat: Phase 1 complete — Tauri v2 foundation 2026-03-17 15:09:41 -04:00
tsconfig.json feat: Phase 1 complete — Tauri v2 foundation 2026-03-17 15:09:41 -04:00
tsconfig.node.json feat: Phase 1 complete — Tauri v2 foundation 2026-03-17 15:09:41 -04:00
vite.config.ts feat: Phase 1 complete — Tauri v2 foundation 2026-03-17 15:09:41 -04:00