Skip to content

Commit 1ebb7e1

Browse files
authored
More aggressive reconnects with ssh session mode (#634)
* more reconnect attempts for ssh session mode * set mouse setting immedialtey
1 parent a7ef60b commit 1ebb7e1

File tree

4 files changed

+31
-19
lines changed

4 files changed

+31
-19
lines changed

src/commands/ssh/common.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ pub async fn create_terminal_client(
141141
token: &str,
142142
params: &SSHConnectParams,
143143
spinner: &mut ProgressBar,
144+
max_attempts: Option<u32>,
144145
) -> Result<TerminalClient> {
145-
let client = TerminalClient::new(ws_url, token, params, spinner).await?;
146+
let client = TerminalClient::new(ws_url, token, params, spinner, max_attempts).await?;
146147
Ok(client)
147148
}
148149

src/commands/ssh/mod.rs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ use crate::{
1111

1212
pub const SSH_CONNECTION_TIMEOUT_SECS: u64 = 30;
1313
pub const SSH_MESSAGE_TIMEOUT_SECS: u64 = 10;
14-
pub const SSH_MAX_CONNECT_ATTEMPTS: usize = 3;
1514
pub const SSH_CONNECT_DELAY_SECS: u64 = 5;
1615
pub const SSH_MAX_EMPTY_MESSAGES: usize = 100;
1716

17+
pub const SSH_MAX_CONNECT_ATTEMPTS: u32 = 3;
18+
pub const SSH_MAX_CONNECT_ATTEMPTS_PERSISTENT: u32 = 20;
19+
1820
mod common;
1921
mod platform;
2022

@@ -65,7 +67,7 @@ pub async fn command(args: Args) -> Result<()> {
6567
let running_command = !args.command.is_empty();
6668

6769
let mut spinner = create_spinner("Connecting to service...".to_string());
68-
let mut terminal_client = create_client(&params, &mut spinner).await?;
70+
let mut terminal_client = create_client(&params, &mut spinner, None).await?;
6971

7072
if running_command {
7173
// Run single command
@@ -93,7 +95,13 @@ async fn run_persistent_session(params: &terminal::SSHConnectParams) -> Result<(
9395
loop {
9496
let mut spinner = create_spinner("Connecting to service...".to_string());
9597

96-
let mut terminal_client = match create_client(params, &mut spinner).await {
98+
let mut terminal_client = match create_client(
99+
params,
100+
&mut spinner,
101+
Some(SSH_MAX_CONNECT_ATTEMPTS_PERSISTENT),
102+
)
103+
.await
104+
{
97105
Ok(tc) => tc,
98106
Err(e) => {
99107
fail_spinner(&mut spinner, format!("{}", e));
@@ -103,14 +111,9 @@ async fn run_persistent_session(params: &terminal::SSHConnectParams) -> Result<(
103111

104112
// Start tmux session
105113
initialize_shell(&mut terminal_client, Some("bash".to_string()), &mut spinner).await?;
106-
terminal_client
107-
.send_data("exec tmux new-session -A -s railway\n")
108-
.await?;
109114

110-
// Set tmux mouse mode on to enable proper scrolling
111-
tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;
112115
terminal_client
113-
.send_data("tmux set -g mouse on; clear\n")
116+
.send_data("exec tmux new-session -A -s railway \\; set -g mouse on \n")
114117
.await?;
115118

116119
// Resend the window size after starting a tmux session
@@ -132,9 +135,11 @@ async fn run_persistent_session(params: &terminal::SSHConnectParams) -> Result<(
132135
println!("Connection reset. Reconnecting...");
133136
continue;
134137
}
135-
term => {
136-
eprintln!("{}", term.message());
137-
std::process::exit(term.exit_code());
138+
SessionTermination::SendError(e)
139+
| SessionTermination::StdinError(e)
140+
| SessionTermination::ServerError(e) => {
141+
println!("Session error: {}. Reconnecting...", e);
142+
continue;
138143
}
139144
};
140145
}
@@ -149,7 +154,7 @@ async fn ensure_tmux_is_installed(params: &terminal::SSHConnectParams) -> Result
149154
let command = "which tmux || (apt-get update && apt-get install -y tmux)";
150155

151156
let mut spinner = create_spinner("Installing tmux...".to_string());
152-
let mut terminal_client = create_client(params, &mut spinner).await?;
157+
let mut terminal_client = create_client(params, &mut spinner, None).await?;
153158

154159
let result =
155160
execute_command_with_result(&mut terminal_client, command.to_string(), &mut spinner).await;
@@ -165,14 +170,16 @@ async fn ensure_tmux_is_installed(params: &terminal::SSHConnectParams) -> Result
165170
async fn create_client(
166171
params: &terminal::SSHConnectParams,
167172
spinner: &mut ProgressBar,
173+
max_attempts: Option<u32>,
168174
) -> Result<TerminalClient> {
169175
let configs = Configs::new()?;
170176
let token = configs
171177
.get_railway_auth_token()
172178
.context("No authentication token found. Please login first with 'railway login'")?;
173179

174180
let ws_url = format!("wss://{}", configs.get_relay_host_path());
175-
let terminal_client = create_terminal_client(&ws_url, &token, params, spinner).await?;
181+
let terminal_client =
182+
create_terminal_client(&ws_url, &token, params, spinner, max_attempts).await?;
176183

177184
Ok(terminal_client)
178185
}

src/controllers/terminal/client.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@ impl TerminalClient {
2727
token: &str,
2828
params: &SSHConnectParams,
2929
spinner: &mut ProgressBar,
30+
max_attempts: Option<u32>,
3031
) -> Result<Self> {
3132
// Use the correct establish_connection function that handles authentication
32-
let ws_stream = establish_connection(url, token, params, spinner).await?;
33+
let ws_stream = establish_connection(url, token, params, spinner, max_attempts).await?;
3334

3435
let mut client = Self {
3536
ws_stream,

src/controllers/terminal/connection.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,22 @@ pub async fn establish_connection(
2525
token: &str,
2626
params: &SSHConnectParams,
2727
spinner: &mut ProgressBar,
28+
max_attempts: Option<u32>,
2829
) -> Result<WebSocketStream<async_tungstenite::tokio::ConnectStream>> {
2930
let url = Url::parse(url)?;
3031

31-
for attempt in 1..=SSH_MAX_CONNECT_ATTEMPTS {
32+
let max_attempts = max_attempts.unwrap_or(SSH_MAX_CONNECT_ATTEMPTS);
33+
34+
for attempt in 1..=max_attempts {
3235
match attempt_connection(&url, token, params).await {
3336
Ok(ws_stream) => {
3437
return Ok(ws_stream);
3538
}
3639
Err(e) => {
37-
if attempt == SSH_MAX_CONNECT_ATTEMPTS {
40+
if attempt == max_attempts {
3841
bail!(
3942
"Failed to establish connection after {} attempts: {}",
40-
SSH_MAX_CONNECT_ATTEMPTS,
43+
max_attempts,
4144
e
4245
);
4346
}

0 commit comments

Comments
 (0)