516f1b1946
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package webterm
|
|
|
|
import (
|
|
"github.com/rcarmo/webterm-go-port/internal/terminalstate"
|
|
)
|
|
|
|
type SessionConnector interface {
|
|
OnData(data []byte)
|
|
OnBinary(payload []byte)
|
|
OnMeta(meta map[string]any)
|
|
OnClose()
|
|
}
|
|
|
|
type Session interface {
|
|
Open(width, height int) error
|
|
Start(connector SessionConnector) error
|
|
Close() error
|
|
Wait() error
|
|
SetTerminalSize(width, height int) error
|
|
SendBytes(data []byte) bool
|
|
SendMeta(meta map[string]any) bool
|
|
IsRunning() bool
|
|
GetReplayBuffer() []byte
|
|
GetScreenSnapshot() terminalstate.Snapshot
|
|
ForceRedraw() error
|
|
UpdateConnector(connector SessionConnector)
|
|
}
|
|
|
|
type noopConnector struct{}
|
|
|
|
func (noopConnector) OnData([]byte) {}
|
|
func (noopConnector) OnBinary([]byte) {}
|
|
func (noopConnector) OnMeta(map[string]any) {}
|
|
func (noopConnector) OnClose() {}
|
|
|
|
func dispatchSessionOutput(filtered []byte, tracker *terminalstate.Tracker, replay *ReplayBuffer, connector SessionConnector) {
|
|
if len(filtered) == 0 {
|
|
return
|
|
}
|
|
replay.Add(filtered)
|
|
hasVisualChange := false
|
|
if tracker != nil {
|
|
_ = tracker.Feed(filtered)
|
|
hasVisualChange = tracker.ConsumeActivityChanged()
|
|
}
|
|
connector.OnData(filtered)
|
|
if hasVisualChange {
|
|
connector.OnMeta(map[string]any{"screen_changed": true})
|
|
}
|
|
}
|
|
|
|
func snapshotFromTracker(tracker *terminalstate.Tracker, width, height int) terminalstate.Snapshot {
|
|
if tracker != nil {
|
|
return tracker.Snapshot()
|
|
}
|
|
if height < 0 {
|
|
height = 0
|
|
}
|
|
return terminalstate.Snapshot{
|
|
Width: width,
|
|
Height: height,
|
|
Buffer: make([][]terminalstate.Cell, height),
|
|
}
|
|
}
|