package main import ( "context" "fmt" "log" "os" "os/signal" "syscall" "time" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/ssh" "github.com/charmbracelet/wish" "github.com/charmbracelet/wish/bubbletea" "github.com/charmbracelet/wish/logging" ) const ( host = "localhost" port = "23457" ) func teaHandler(s ssh.Session) (tea.Model, []tea.ProgramOption) { m := InitialModel(s.User()) return m, []tea.ProgramOption{tea.WithAltScreen()} } func main() { s, err := wish.NewServer( wish.WithAddress(fmt.Sprintf("%s:%s", host, port)), wish.WithHostKeyPath(".ssh/term_info_ed25519"), wish.WithMiddleware( bubbletea.Middleware(teaHandler), logging.Middleware(), ), ) if err != nil { log.Fatalln(err) } done := make(chan os.Signal, 1) signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) log.Printf("Starting SSH server on %s:%s", host, port) log.Printf("Connect with: ssh %s -p %s", host, port) go func() { if err = s.ListenAndServe(); err != nil { log.Fatalln(err) } }() <-done log.Println("Stopping SSH server") ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() if err := s.Shutdown(ctx); err != nil { log.Fatalln(err) } }