Repository navigation
fix: close client tunnel relay when the target ends the channel - #9
Merged
LukeGus merged 1 commit intoNov 7, 2026
Merged
Conversation
|
AI review | Looks safe to merge Adds an Reviewed f6f4f43. AI can be wrong, a maintainer still decides. Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #8
Client tunnels left the desktop's local socket open after the target closed its side of the connection. Browsers reused that dead keep-alive connection, so the next request stayed pending forever. One example: the LiteLLM login after its 5-second idle timeout.
The relay in
c2s-relay.tsnow also closes the WebSocket when the outbound SSH channel emitsend. Before, it only closed oncloseanderror. The existing close handler then destroys the channel, and the desktop closes the local socket. This matches howssh -Dbehaves.Validation:
tests/backend/c2s-relay.test.tshalf-closes the outbound stream of a LOCAL tunnel and expects the relay to close. It fails without the change and passes with it.npm test(153 passed),tsc -p .,npm run validate,npm run format:check.This is independent of #7, which fixes the desktop-side first-data race.