tui-logs-ctx.diff

· erock's pastes · raw

expires: 2025-01-04

  1diff --git a/shared/sendlog.go b/shared/sendlog.go
  2index bd032df..fe4a01c 100644
  3--- a/shared/sendlog.go
  4+++ b/shared/sendlog.go
  5@@ -378,6 +378,7 @@ func ConnectToLogs(ctx context.Context) (io.Reader, error) {
  6 
  7 	go func() {
  8 		<-ctx.Done()
  9+		fmt.Println("CLOSE SSH CONNECT")
 10 		session.Close()
 11 		sshClient.Close()
 12 	}()
 13diff --git a/tui/common/model.go b/tui/common/model.go
 14index 0c30356..bcca05e 100644
 15--- a/tui/common/model.go
 16+++ b/tui/common/model.go
 17@@ -1,6 +1,7 @@
 18 package common
 19 
 20 import (
 21+	"context"
 22 	"log/slog"
 23 
 24 	"github.com/charmbracelet/ssh"
 25@@ -19,4 +20,5 @@ type SharedModel struct {
 26 	Height          int
 27 	HeaderHeight    int
 28 	Styles          Styles
 29+	Ctx             context.Context
 30 }
 31diff --git a/tui/logs/logs.go b/tui/logs/logs.go
 32index e221ac6..a3c061b 100644
 33--- a/tui/logs/logs.go
 34+++ b/tui/logs/logs.go
 35@@ -2,6 +2,7 @@ package logs
 36 
 37 import (
 38 	"bufio"
 39+	"context"
 40 	"encoding/json"
 41 	"fmt"
 42 	"strings"
 43@@ -31,6 +32,8 @@ type Model struct {
 44 	viewport viewport.Model
 45 	input    input.Model
 46 	sub      chan map[string]any
 47+	ctx      context.Context
 48+	done     context.CancelFunc
 49 }
 50 
 51 func headerHeight(shrd common.SharedModel) int {
 52@@ -59,6 +62,8 @@ func NewModel(shrd common.SharedModel) Model {
 53 	viewport.YPosition = hh
 54 	viewport.SetContent(defMsg)
 55 
 56+	ctx, cancel := context.WithCancel(shrd.Session.Context())
 57+
 58 	return Model{
 59 		shared:   shrd,
 60 		state:    stateReady,
 61@@ -66,13 +71,15 @@ func NewModel(shrd common.SharedModel) Model {
 62 		logData:  []map[string]any{},
 63 		input:    im,
 64 		sub:      make(chan map[string]any),
 65+		ctx:      ctx,
 66+		done:     cancel,
 67 	}
 68 }
 69 
 70 func (m Model) Init() tea.Cmd {
 71 	return tea.Batch(
 72 		m.connectLogs(m.sub),
 73-		waitForActivity(m.sub),
 74+		m.waitForActivity(m.sub),
 75 	)
 76 }
 77 
 78@@ -86,6 +93,7 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 79 		hh := headerHeight(m.shared)
 80 		m.viewport.Height = msg.Height - hh - inputHeight
 81 		m.viewport.SetContent(logsToStr(m.shared.Styles, m.logData, m.input.Value()))
 82+
 83 	case logLineLoadedMsg:
 84 		m.logData = append(m.logData, msg)
 85 		lng := len(m.logData)
 86@@ -100,7 +108,16 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 87 		if wasAt {
 88 			m.viewport.GotoBottom()
 89 		}
 90-		cmds = append(cmds, waitForActivity(m.sub))
 91+		cmds = append(cmds, m.waitForActivity(m.sub))
 92+
 93+	case pages.NavigateMsg:
 94+		fmt.Println("NAV AWAY")
 95+		// cancel activity logger
 96+		m.done()
 97+		// reset model
 98+		next := NewModel(m.shared)
 99+		return next, next.Init()
100+
101 	case tea.KeyMsg:
102 		switch msg.String() {
103 		case "q", "esc":
104@@ -130,18 +147,22 @@ func (m Model) View() string {
105 	return m.viewport.View() + "\n" + m.input.View()
106 }
107 
108-func waitForActivity(sub chan map[string]any) tea.Cmd {
109+func (m Model) waitForActivity(sub chan map[string]any) tea.Cmd {
110 	return func() tea.Msg {
111-		result := <-sub
112-		return logLineLoadedMsg(result)
113+		select {
114+		case result := <-sub:
115+			return logLineLoadedMsg(result)
116+		case <-m.ctx.Done():
117+			fmt.Println("CTX DONE")
118+			return nil
119+		}
120 	}
121 }
122 
123 func (m Model) connectLogs(sub chan map[string]any) tea.Cmd {
124 	return func() tea.Msg {
125-		stdoutPipe, err := shared.ConnectToLogs(m.shared.Session.Context())
126+		stdoutPipe, err := shared.ConnectToLogs(m.ctx)
127 		if err != nil {
128-			fmt.Println(err)
129 			return nil
130 		}
131