Skip to content

Commit 27f36f7

Browse files
committed
cmd/tsconnect: output errors to the JS console too
We were just outputting them to the terminal, but that's hard to debug because we immediately tear down the terminal when getting an error. Signed-off-by: Mihai Parparita <mihai@tailscale.com>
1 parent 122bd66 commit 27f36f7

File tree

3 files changed

+24
-9
lines changed

3 files changed

+24
-9
lines changed

cmd/tsconnect/src/lib/ssh.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,39 @@ export function runSSHSession(
2727

2828
term.focus()
2929

30-
const sshSession = ipn.ssh(def.hostname, def.username, {
31-
writeFn: (input) => term.write(input),
32-
setReadFn: (hook) => (onDataHook = hook),
30+
let resizeObserver: ResizeObserver | undefined
31+
let handleBeforeUnload: ((e: BeforeUnloadEvent) => void) | undefined
32+
33+
const sshSession = ipn.ssh(def.hostname + "2", def.username, {
34+
writeFn(input) {
35+
term.write(input)
36+
},
37+
writeErrorFn(err) {
38+
console.error(err)
39+
term.write(err)
40+
},
41+
setReadFn(hook) {
42+
onDataHook = hook
43+
},
3344
rows: term.rows,
3445
cols: term.cols,
35-
onDone: () => {
36-
resizeObserver.disconnect()
46+
onDone() {
47+
resizeObserver?.disconnect()
3748
term.dispose()
38-
window.removeEventListener("beforeunload", handleBeforeUnload)
49+
if (handleBeforeUnload) {
50+
window.removeEventListener("beforeunload", handleBeforeUnload)
51+
}
3952
onDone()
4053
},
4154
})
4255

4356
// Make terminal and SSH session track the size of the containing DOM node.
44-
const resizeObserver = new ResizeObserver(() => fitAddon.fit())
57+
resizeObserver = new ResizeObserver(() => fitAddon.fit())
4558
resizeObserver.observe(termContainerNode)
4659
term.onResize(({ rows, cols }) => sshSession.resize(rows, cols))
4760

4861
// Close the session if the user closes the window without an explicit
4962
// exit.
50-
const handleBeforeUnload = () => sshSession.close()
63+
handleBeforeUnload = () => sshSession.close()
5164
window.addEventListener("beforeunload", handleBeforeUnload)
5265
}

cmd/tsconnect/src/types/wasm_js.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ declare global {
1919
username: string,
2020
termConfig: {
2121
writeFn: (data: string) => void
22+
writeErrorFn: (err: string) => void
2223
setReadFn: (readFn: (data: string) => void) => void
2324
rows: number
2425
cols: number

cmd/tsconnect/wasm/wasm_js.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@ type jsSSHSession struct {
347347

348348
func (s *jsSSHSession) Run() {
349349
writeFn := s.termConfig.Get("writeFn")
350+
writeErrorFn := s.termConfig.Get("writeErrorFn")
350351
setReadFn := s.termConfig.Get("setReadFn")
351352
rows := s.termConfig.Get("rows").Int()
352353
cols := s.termConfig.Get("cols").Int()
@@ -357,7 +358,7 @@ func (s *jsSSHSession) Run() {
357358
writeFn.Invoke(s)
358359
}
359360
writeError := func(label string, err error) {
360-
write(fmt.Sprintf("%s Error: %v\r\n", label, err))
361+
writeErrorFn.Invoke(fmt.Sprintf("%s Error: %v\r\n", label, err))
361362
}
362363

363364
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)

0 commit comments

Comments
 (0)