From 4a40090a5f8af82604def3af9eee4df5672304c4 Mon Sep 17 00:00:00 2001 From: realrasengan Date: Mon, 30 Mar 2026 20:35:55 -0700 Subject: [PATCH] switch to unixshells/vt-go, ungate framebuffer for WASM - Replace charmbracelet/x/vt with unixshells/vt-go (IRM support) - Remove ultraviolet import from framebuffer.go (use local attr constants) - Framebuffer compiles for all platforms including js/wasm - WASM build requires -tags osusergo for os/user compatibility --- framebuffer.go | 29 ++++++++++++++++++----------- go.mod | 4 ++-- go.sum | 4 ++-- server.go | 2 +- 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/framebuffer.go b/framebuffer.go index e37688b..e1d43c5 100644 --- a/framebuffer.go +++ b/framebuffer.go @@ -1,5 +1,3 @@ -//go:build !js - package mosh import ( @@ -7,9 +5,18 @@ import ( "strconv" "unicode/utf8" - uv "github.com/charmbracelet/ultraviolet" "github.com/charmbracelet/x/ansi" - "github.com/charmbracelet/x/vt" + "github.com/unixshells/vt-go" +) + +// Cell attribute bitmasks (matching charmbracelet/ultraviolet values). +const ( + attrBold = 1 << 0 + attrFaint = 1 << 1 + attrItalic = 1 << 2 + attrBlink = 1 << 3 + attrReverse = 1 << 4 + attrStrikethrough = 1 << 5 ) // Framebuffer represents a terminal screen state for mosh SSP. @@ -403,13 +410,13 @@ func SnapshotEmulator(emu *vt.Emulator, cursorVisible bool) *Framebuffer { } // Attributes. - cell.Attr.Bold = c.Style.Attrs&uv.AttrBold != 0 - cell.Attr.Dim = c.Style.Attrs&uv.AttrFaint != 0 - cell.Attr.Italic = c.Style.Attrs&uv.AttrItalic != 0 - cell.Attr.Blink = c.Style.Attrs&uv.AttrBlink != 0 - cell.Attr.Reverse = c.Style.Attrs&uv.AttrReverse != 0 - cell.Attr.Strike = c.Style.Attrs&uv.AttrStrikethrough != 0 - cell.Attr.Under = c.Style.Underline != uv.UnderlineNone + cell.Attr.Bold = c.Style.Attrs&attrBold != 0 + cell.Attr.Dim = c.Style.Attrs&attrFaint != 0 + cell.Attr.Italic = c.Style.Attrs&attrItalic != 0 + cell.Attr.Blink = c.Style.Attrs&attrBlink != 0 + cell.Attr.Reverse = c.Style.Attrs&attrReverse != 0 + cell.Attr.Strike = c.Style.Attrs&attrStrikethrough != 0 + cell.Attr.Under = c.Style.Underline != ansi.UnderlineNone cell.Attr.FG = convertColor(c.Style.Fg) cell.Attr.BG = convertColor(c.Style.Bg) diff --git a/go.mod b/go.mod index 6d1934e..d101575 100644 --- a/go.mod +++ b/go.mod @@ -3,16 +3,16 @@ module github.com/unixshells/mosh-go go 1.26.0 require ( - github.com/charmbracelet/ultraviolet v0.0.0-20260303162955-0b88c25f3fff github.com/charmbracelet/x/ansi v0.11.6 - github.com/charmbracelet/x/vt v0.0.0-20260305213658-fe36e8c10185 github.com/creack/pty v1.1.24 + github.com/unixshells/vt-go v0.1.0 golang.org/x/crypto v0.49.0 golang.org/x/term v0.41.0 ) require ( github.com/charmbracelet/colorprofile v0.4.2 // indirect + github.com/charmbracelet/ultraviolet v0.0.0-20260303162955-0b88c25f3fff // indirect github.com/charmbracelet/x/exp/ordered v0.1.0 // indirect github.com/charmbracelet/x/term v0.2.2 // indirect github.com/charmbracelet/x/termios v0.1.1 // indirect diff --git a/go.sum b/go.sum index a21bda2..bb46810 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,6 @@ github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSg github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= -github.com/charmbracelet/x/vt v0.0.0-20260305213658-fe36e8c10185 h1:KYS9lWBROkdkuyc0bdQuS8C86Me3OAgjUAKcB4zArlg= -github.com/charmbracelet/x/vt v0.0.0-20260305213658-fe36e8c10185/go.mod h1:2djWW5EeP5QlpztEYYbbyyzUyyxVD71mWVQguNISHcM= github.com/charmbracelet/x/windows v0.2.2 h1:IofanmuvaxnKHuV04sC0eBy/smG6kIKrWG2/jYn2GuM= github.com/charmbracelet/x/windows v0.2.2/go.mod h1:/8XtdKZzedat74NQFn0NGlGL4soHB0YQZrETF96h75k= github.com/clipperhouse/displaywidth v0.9.0 h1:Qb4KOhYwRiN3viMv1v/3cTBlz3AcAZX3+y9OLhMtAtA= @@ -30,6 +28,8 @@ github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELU github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/unixshells/vt-go v0.1.0 h1:HWILcExV8MHc6o2YqIRMIM/KrjH31kPzZrlvLS9BG6Y= +github.com/unixshells/vt-go v0.1.0/go.mod h1:dZpOXxVyO7LG1uxkVMixX7HwUf2ZbUkEKhtHHJTTIBI= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4= diff --git a/server.go b/server.go index 3c4894f..fc10a35 100644 --- a/server.go +++ b/server.go @@ -15,7 +15,7 @@ import ( "sync/atomic" "time" - "github.com/charmbracelet/x/vt" + "github.com/unixshells/vt-go" "github.com/creack/pty" )