feat(muxterm): wire protocol types and parser
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
package main
|
||||
|
||||
import "encoding/json"
|
||||
|
||||
// --- Client-to-server message types ---
|
||||
|
||||
// AttachMsg requests attaching to a named tmux session.
|
||||
type AttachMsg struct {
|
||||
Attach string `json:"attach"`
|
||||
}
|
||||
|
||||
// ResizeMsg requests a PTY resize.
|
||||
type ResizeMsg struct {
|
||||
Resize struct {
|
||||
Cols int `json:"cols"`
|
||||
Rows int `json:"rows"`
|
||||
} `json:"resize"`
|
||||
}
|
||||
|
||||
// DetachMsg requests detaching from the current session.
|
||||
type DetachMsg struct {
|
||||
Detach bool `json:"detach"`
|
||||
}
|
||||
|
||||
// --- Server-to-client message types ---
|
||||
|
||||
// AttachedMsg confirms a successful attach.
|
||||
type AttachedMsg struct {
|
||||
Attached string `json:"attached"`
|
||||
}
|
||||
|
||||
// ErrorMsg reports an error to the client.
|
||||
type ErrorMsg struct {
|
||||
Error string `json:"error"`
|
||||
}
|
||||
|
||||
// ExitedMsg reports that a session's process has exited.
|
||||
type ExitedMsg struct {
|
||||
Exited string `json:"exited"`
|
||||
}
|
||||
|
||||
// ParseControlMessage unmarshals a JSON control message and returns the
|
||||
// message kind and a pointer to the typed value. Returns ("invalid", nil)
|
||||
// for unparseable JSON and ("unknown", nil) for unrecognised keys.
|
||||
func ParseControlMessage(data []byte) (string, interface{}) {
|
||||
var raw map[string]json.RawMessage
|
||||
if err := json.Unmarshal(data, &raw); err != nil {
|
||||
return "invalid", nil
|
||||
}
|
||||
|
||||
if _, ok := raw["attach"]; ok {
|
||||
var msg AttachMsg
|
||||
if err := json.Unmarshal(data, &msg); err != nil {
|
||||
return "invalid", nil
|
||||
}
|
||||
return "attach", &msg
|
||||
}
|
||||
|
||||
if _, ok := raw["resize"]; ok {
|
||||
var msg ResizeMsg
|
||||
if err := json.Unmarshal(data, &msg); err != nil {
|
||||
return "invalid", nil
|
||||
}
|
||||
return "resize", &msg
|
||||
}
|
||||
|
||||
if _, ok := raw["detach"]; ok {
|
||||
var msg DetachMsg
|
||||
if err := json.Unmarshal(data, &msg); err != nil {
|
||||
return "invalid", nil
|
||||
}
|
||||
return "detach", &msg
|
||||
}
|
||||
|
||||
return "unknown", nil
|
||||
}
|
||||
|
||||
// MarshalAttached returns JSON for an AttachedMsg.
|
||||
func MarshalAttached(session string) []byte {
|
||||
b, _ := json.Marshal(AttachedMsg{Attached: session})
|
||||
return b
|
||||
}
|
||||
|
||||
// MarshalError returns JSON for an ErrorMsg.
|
||||
func MarshalError(msg string) []byte {
|
||||
b, _ := json.Marshal(ErrorMsg{Error: msg})
|
||||
return b
|
||||
}
|
||||
|
||||
// MarshalExited returns JSON for an ExitedMsg.
|
||||
func MarshalExited(session string) []byte {
|
||||
b, _ := json.Marshal(ExitedMsg{Exited: session})
|
||||
return b
|
||||
}
|
||||
Reference in New Issue
Block a user