fix: better ssh resilience and customizable timeout for future backoff

This commit is contained in:
Aarnav Tale
2025-06-16 11:23:44 -04:00
parent 6a0e097412
commit 7f376c3f70
4 changed files with 48 additions and 31 deletions
+16 -22
View File
@@ -43,26 +43,14 @@ func ParseTsWasmNetOptions(obj js.Value) (*TsWasmNetOptions, error) {
// Options passed from the JS side to pass data to xterm.js.
type SSHXtermConfig struct {
// Number of rows in the PTY.
Rows int
// Number of columns in the PTY.
Cols int
// Fires when the PTY has output.
OnStdout func(data string)
// Fires when the PTY has an error.
OnStderr func(error string)
// Passes a function to the JS side to provide input.
OnStdin js.Value
// Fires when the PTY is opened.
OnConnect func()
// Fires when the PTY is closed.
OnDisconnect func()
Timeout int // Timeout in seconds for the PTY connection.
Rows int // Number of rows in the PTY.
Cols int // Number of columns in the PTY.
OnStdout func(data string) // Fires when the PTY has output.
OnStderr func(error string) // Fires when the PTY has an error.
OnStdin js.Value // Passes a function to the JS side to provide input.
OnConnect func() // Fires when the PTY is opened.
OnDisconnect func() // Fires when the PTY is closed.
}
// Parses the provided JS object to validate and extract SSHXtermConfig.
@@ -71,6 +59,7 @@ func ParseSSHXtermConfig(obj js.Value) (*SSHXtermConfig, error) {
return nil, errors.New("SSHXtermConfig cannot be undefined or null")
}
timeout := safeInt("Timeout", obj)
rows := safeInt("Rows", obj)
cols := safeInt("Cols", obj)
@@ -78,9 +67,14 @@ func ParseSSHXtermConfig(obj js.Value) (*SSHXtermConfig, error) {
return nil, errors.New("Rows and Cols must be positive integers")
}
if timeout <= 0 {
timeout = 30 // Default timeout to 30 seconds if not specified
}
config := &SSHXtermConfig{
Rows: rows,
Cols: cols,
Timeout: timeout,
Rows: rows,
Cols: cols,
}
onStdout := obj.Get("OnStdout")
+1 -2
View File
@@ -50,8 +50,7 @@ func (i *TsWasmIpn) NewSSHSession(hostname, username string, termConfig *SSHXter
func (s *SSHSession) ConnectAndRun() {
defer s.TermConfig.OnDisconnect()
// Default to a 5 second timeout for the connection AFTER dial.
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(s.TermConfig.Timeout)*time.Second)
defer cancel()
// TODO: Log here