Skip to content

Commit edff84c

Browse files
committed
libghostty,internal: replace wazero with wasm2go
1 parent 9191a67 commit edff84c

17 files changed

Lines changed: 53806 additions & 315 deletions

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
libghostty/wasmvt/vt.generated.go linguist-generated=true

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ vt/.zig-cache/
55
huti.asc
66
/ht
77
/.pi/
8+
/libghostty/hauntty-vt.wasm

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ require (
66
github.com/BurntSushi/toml v1.6.0
77
github.com/alecthomas/kong v1.14.0
88
github.com/creack/pty v1.1.24
9-
github.com/tetratelabs/wazero v1.11.0
109
golang.org/x/sys v0.41.0
1110
golang.org/x/term v0.40.0
1211
)
1312

1413
require (
14+
github.com/ncruces/wasm2go v0.2.2 // indirect
1515
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 // indirect
1616
golang.org/x/mod v0.33.0 // indirect
1717
golang.org/x/sync v0.19.0 // indirect
@@ -27,6 +27,7 @@ require (
2727
)
2828

2929
tool (
30+
github.com/ncruces/wasm2go
3031
golang.org/x/tools/cmd/deadcode
3132
golang.org/x/tools/cmd/goimports
3233
honnef.co/go/tools/cmd/staticcheck

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
1818
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
1919
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
2020
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
21+
github.com/ncruces/wasm2go v0.2.2 h1:aPLqdGYGL0YzTajgtzn/a7bNUDJbNrz2imNidR5VmXE=
22+
github.com/ncruces/wasm2go v0.2.2/go.mod h1:XIM3a6oVdTfxP9RzVa41M2uSCuu5RQBCHG5lMc37OP0=
2123
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
2224
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
23-
github.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA=
24-
github.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU=
2525
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678 h1:1P7xPZEwZMoBoz0Yze5Nx2/4pxj6nw9ZqHWXqP0iRgQ=
2626
golang.org/x/exp/typeparams v0.0.0-20231108232855-2478ac86f678/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
2727
golang.org/x/mod v0.33.0 h1:tHFzIWbBifEmbwtGz65eaWyGiGZatSrT9prnU8DbVL8=

internal/daemon/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func New(ctx context.Context, cfg *config.DaemonConfig, resizePolicy config.Resi
4747
return nil, fmt.Errorf("daemon: state_persistence_interval must be > 0 when state persistence is enabled")
4848
}
4949

50-
rt, err := libghostty.NewRuntime(ctx)
50+
rt, err := libghostty.NewRuntime()
5151
if err != nil {
5252
return nil, fmt.Errorf("daemon: init wasm runtime: %w", err)
5353
}

internal/daemon/server_control.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func (s *Server) handleSendKey(conn *protocol.Conn, msg *protocol.SendKey) {
7777
return
7878
}
7979

80-
data, err := sess.term.EncodeKey(s.ctx, libghostty.KeyCode(msg.Key), libghostty.Modifier(msg.Mods))
80+
data, err := sess.term.EncodeKey(libghostty.KeyCode(msg.Key), libghostty.Modifier(msg.Mods))
8181
if err != nil {
8282
writeError(conn, err.Error())
8383
return

internal/daemon/server_inspect.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,19 @@ func dumpFormat(format protocol.DumpFormat) libghostty.DumpFormat {
119119
func dumpDeadState(ctx context.Context, rt *libghostty.Runtime, state *sessionState, scrollback uint32, format protocol.DumpFormat) ([]byte, error) {
120120
scrollback = max(scrollback, uint32(bytes.Count(state.VT, []byte{'\n'}))+uint32(state.Rows)+1)
121121

122-
term, err := rt.NewTerminal(ctx, uint32(state.Cols), uint32(state.Rows), scrollback)
122+
term, err := rt.NewTerminal(uint32(state.Cols), uint32(state.Rows), scrollback)
123123
if err != nil {
124124
return nil, fmt.Errorf("dump dead state: new terminal: %w", err)
125125
}
126-
defer term.Close(ctx)
126+
defer term.Close()
127127

128128
if len(state.VT) > 0 {
129-
if err := term.Feed(ctx, state.VT); err != nil {
129+
if err := term.Feed(state.VT); err != nil {
130130
return nil, fmt.Errorf("dump dead state: feed vt: %w", err)
131131
}
132132
}
133133

134-
dump, err := term.DumpScreen(ctx, dumpFormat(format))
134+
dump, err := term.DumpScreen(dumpFormat(format))
135135
if err != nil {
136136
return nil, fmt.Errorf("dump dead state: dump screen: %w", err)
137137
}
@@ -227,7 +227,7 @@ func (s *Server) statusSnapshot(sessionName string) (uint32, uint32, *protocol.S
227227
}
228228

229229
func sessionCWD(ctx context.Context, sess *Session) (string, error) {
230-
cwd, ok, err := sess.term.GetCwd(ctx)
230+
cwd, ok, err := sess.term.GetCwd()
231231
if err != nil {
232232
return "", fmt.Errorf("lookup cwd for %s: %w", sess.Name, err)
233233
}

internal/daemon/session_clients.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (s *Session) resize(size termSize) {
9797
slog.Warn("pty setsize", "session", s.Name, "err", err)
9898
}
9999
_ = syscall.Kill(-int(s.PID), syscall.SIGWINCH)
100-
if err := s.term.Resize(s.ctx, uint32(size.cols), uint32(size.rows)); err != nil {
100+
if err := s.term.Resize(uint32(size.cols), uint32(size.rows)); err != nil {
101101
slog.Warn("wasm resize", "session", s.Name, "err", err)
102102
}
103103
}

internal/daemon/session_lifecycle.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,48 +68,48 @@ func startSession(ctx context.Context, launch *sessionLaunch, term *libghostty.T
6868
}
6969

7070
func newSession(ctx context.Context, wasmRT *libghostty.Runtime, resizePolicy config.ResizePolicy, spec sessionStartSpec) (*Session, error) {
71-
term, err := wasmRT.NewTerminal(ctx, uint32(spec.size.cols), uint32(spec.size.rows), spec.scrollback)
71+
term, err := wasmRT.NewTerminal(uint32(spec.size.cols), uint32(spec.size.rows), spec.scrollback)
7272
if err != nil {
7373
return nil, err
7474
}
7575

7676
launch, err := launchSessionProcess(spec)
7777
if err != nil {
78-
term.Close(ctx)
78+
term.Close()
7979
return nil, err
8080
}
8181

8282
return startSession(ctx, launch, term, resizePolicy, spec), nil
8383
}
8484

8585
func restoreSession(ctx context.Context, wasmRT *libghostty.Runtime, state *sessionState, resizePolicy config.ResizePolicy, spec sessionStartSpec) (*Session, error) {
86-
term, err := wasmRT.NewTerminal(ctx, uint32(state.Cols), uint32(state.Rows), spec.scrollback)
86+
term, err := wasmRT.NewTerminal(uint32(state.Cols), uint32(state.Rows), spec.scrollback)
8787
if err != nil {
8888
return nil, err
8989
}
9090

9191
cleanup := true
9292
defer func() {
9393
if cleanup {
94-
term.Close(ctx)
94+
term.Close()
9595
}
9696
}()
9797

9898
if len(state.VT) > 0 {
99-
if err := term.Feed(ctx, state.VT); err != nil {
99+
if err := term.Feed(state.VT); err != nil {
100100
return nil, err
101101
}
102102
}
103103
if state.IsAltScreen {
104-
if err := term.Feed(ctx, []byte("\x1b[?1049l")); err != nil {
104+
if err := term.Feed([]byte("\x1b[?1049l")); err != nil {
105105
return nil, err
106106
}
107107
}
108-
if err := term.Feed(ctx, []byte("\x1b[!p")); err != nil {
108+
if err := term.Feed([]byte("\x1b[!p")); err != nil {
109109
return nil, err
110110
}
111111
if state.Cols != spec.size.cols || state.Rows != spec.size.rows {
112-
if err := term.Resize(ctx, uint32(spec.size.cols), uint32(spec.size.rows)); err != nil {
112+
if err := term.Resize(uint32(spec.size.cols), uint32(spec.size.rows)); err != nil {
113113
slog.Warn("wasm resize on restore", "session", spec.name, "err", err)
114114
}
115115
}
@@ -125,7 +125,7 @@ func restoreSession(ctx context.Context, wasmRT *libghostty.Runtime, state *sess
125125

126126
func (s *Session) feedLoop(ctx context.Context) {
127127
for item := range s.feedCh {
128-
if err := s.term.Feed(ctx, *item.data); err != nil {
128+
if err := s.term.Feed(*item.data); err != nil {
129129
slog.Debug("wasm feed error", "session", s.Name, "err", err)
130130
}
131131
s.feedApplied.Store(item.seq)
@@ -240,7 +240,7 @@ func (s *Session) run() {
240240
// Attach dumps must reflect every PTY chunk we've already accepted.
241241
s.waitFeedApplied(nextFeedSeq)
242242

243-
dump, err := s.term.DumpScreen(s.ctx, libghostty.DumpVTFull)
243+
dump, err := s.term.DumpScreen(libghostty.DumpVTFull)
244244
if err != nil {
245245
a.result <- attachResp{err: err}
246246
continue
@@ -363,7 +363,7 @@ func (s *Session) close(ctx context.Context) {
363363
_ = syscall.Kill(-int(s.PID), syscall.SIGKILL)
364364
<-s.done
365365
}
366-
s.term.Close(ctx)
366+
s.term.Close()
367367
if s.tempDir != "" {
368368
os.RemoveAll(s.tempDir)
369369
}
@@ -379,7 +379,7 @@ func (s *Session) sendInput(data []byte) error {
379379
}
380380

381381
func (s *Session) dumpScreen(ctx context.Context, format libghostty.DumpFormat) (*libghostty.ScreenDump, error) {
382-
return s.term.DumpScreen(ctx, format)
382+
return s.term.DumpScreen(format)
383383
}
384384

385385
func exitCodeFromWaitStatus(ws syscall.WaitStatus) int32 {

internal/daemon/session_loop_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ func (discardRW) Write(p []byte) (int, error) {
2525

2626
func newSessionLoopHarness(t *testing.T) *Session {
2727
ctx := t.Context()
28-
rt, err := libghostty.NewRuntime(ctx)
28+
rt, err := libghostty.NewRuntime()
2929
assert.NilError(t, err)
3030
t.Cleanup(func() {
3131
assert.NilError(t, rt.Close())
3232
})
3333

34-
term, err := rt.NewTerminal(ctx, 80, 24, 0)
34+
term, err := rt.NewTerminal(80, 24, 0)
3535
assert.NilError(t, err)
3636

3737
ptmx, tty, err := pty.Open()
@@ -63,7 +63,7 @@ func newSessionLoopHarness(t *testing.T) *Session {
6363
<-s.done
6464
assert.NilError(t, ptmx.Close())
6565
assert.NilError(t, tty.Close())
66-
assert.NilError(t, term.Close(ctx))
66+
assert.NilError(t, term.Close())
6767
})
6868

6969
return s

0 commit comments

Comments
 (0)