forked from alibaba/kt-connect
-
Notifications
You must be signed in to change notification settings - Fork 2
/
xterm.go
59 lines (49 loc) · 1.24 KB
/
xterm.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package ws
import (
"encoding/json"
"github.com/gorilla/websocket"
"k8s.io/client-go/tools/remotecommand"
)
// StreamHandler ...
type StreamHandler struct {
WsConn *Connection
ResizeEvent chan remotecommand.TerminalSize
}
type xtermMessage struct {
MsgType string `json:"type"` // resize || input
Input string `json:"input"`
Rows uint16 `json:"rows"`
Cols uint16 `json:"cols"`
}
// Next ...
func (handler *StreamHandler) Next() (size *remotecommand.TerminalSize) {
ret := <-handler.ResizeEvent
size = &ret
return
}
func (handler *StreamHandler) Read(p []byte) (size int, err error) {
var (
msg *Message
xtermMsg xtermMessage
)
if msg, err = handler.WsConn.WsRead(); err != nil {
return
}
if err = json.Unmarshal(msg.Data, &xtermMsg); err != nil {
return
}
if xtermMsg.MsgType == "resize" {
handler.ResizeEvent <- remotecommand.TerminalSize{Width: xtermMsg.Cols, Height: xtermMsg.Rows}
} else if xtermMsg.MsgType == "input" {
size = len(xtermMsg.Input)
copy(p, xtermMsg.Input)
}
return
}
func (handler *StreamHandler) Write(p []byte) (size int, err error) {
var copyData = make([]byte, len(p))
copy(copyData, p)
size = len(p)
err = handler.WsConn.WsWrite(websocket.TextMessage, copyData)
return
}