Skip to content

Commit 1a44c98

Browse files
committed
chore(workflow-cli): add tty resize support
1 parent 000278a commit 1a44c98

1 file changed

Lines changed: 49 additions & 19 deletions

File tree

cmd/ps.go

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@ import (
1515
"golang.org/x/net/websocket"
1616
)
1717

18+
const (
19+
STDIN_CHANNEL = "\x00"
20+
STDOUT_CHANNEL = "\x01"
21+
STDERR_CHANNEL = "\x02"
22+
ERROR_CHANNEL = "\x03"
23+
RESIZE_CHANNEL = "\x04"
24+
)
25+
1826
// PsList lists an app's processes.
1927
func (d *DryccCmd) PsList(appID string, results int) error {
2028
s, appID, err := load(d.ConfigFile, appID)
@@ -151,17 +159,7 @@ func printExec(d *DryccCmd, conn *websocket.Conn) error {
151159
return nil
152160
}
153161

154-
func streamExec(conn *websocket.Conn, tty bool) error {
155-
c := console.Current()
156-
defer c.Reset()
157-
if tty {
158-
if err := c.SetRaw(); err != nil {
159-
return err
160-
}
161-
}
162-
163-
recvQueue := make(chan string)
164-
defer close(recvQueue)
162+
func runRecvTask(conn *websocket.Conn, c console.Console, recvChan, sendChan chan string) (context.Context, context.CancelFunc) {
165163
ctx, cancel := context.WithCancel(context.Background())
166164
go func() {
167165
for {
@@ -171,12 +169,9 @@ func streamExec(conn *websocket.Conn, tty bool) error {
171169
cancel()
172170
break
173171
}
174-
recvQueue <- message
172+
recvChan <- message
175173
}
176174
}()
177-
178-
sendQueue := make(chan string)
179-
defer close(sendQueue)
180175
go func() {
181176
buf := make([]byte, 1024)
182177
for {
@@ -187,20 +182,55 @@ func streamExec(conn *websocket.Conn, tty bool) error {
187182
} else if err != nil {
188183
continue
189184
} else {
190-
sendQueue <- string(buf[:size])
185+
sendChan <- string(buf[:size])
191186
}
192187
}
193188
}()
189+
return ctx, cancel
190+
}
194191

192+
func runResizeTask(conn *websocket.Conn, c console.Console) {
193+
go func() {
194+
var size console.WinSize
195+
for {
196+
if tmpSize, err := c.Size(); err == nil {
197+
if size.Height != tmpSize.Height || size.Width != tmpSize.Width {
198+
size = tmpSize
199+
message := fmt.Sprintf(`{"Height": %d, "Width": %d}`, size.Height, size.Width)
200+
if err := websocket.Message.Send(conn, RESIZE_CHANNEL+message); err != nil {
201+
break
202+
}
203+
}
204+
}
205+
time.Sleep(time.Duration(1) * time.Second)
206+
}
207+
}()
208+
}
209+
210+
func streamExec(conn *websocket.Conn, tty bool) error {
211+
c := console.Current()
212+
defer c.Reset()
213+
if tty {
214+
if err := c.SetRaw(); err != nil {
215+
return err
216+
} else {
217+
runResizeTask(conn, c)
218+
}
219+
}
220+
recvChan, sendChan := make(chan string, 10), make(chan string, 10)
221+
ctx, cancel := runRecvTask(conn, c, recvChan, sendChan)
222+
defer cancel()
223+
defer close(recvChan)
224+
defer close(sendChan)
195225
for {
196226
select {
197227
case <-ctx.Done():
198228
return nil
199-
case message := <-sendQueue:
200-
if err := websocket.Message.Send(conn, message); err != nil {
229+
case message := <-sendChan:
230+
if err := websocket.Message.Send(conn, STDIN_CHANNEL+message); err != nil {
201231
return err
202232
}
203-
case message := <-recvQueue:
233+
case message := <-recvChan:
204234
c.Write([]byte(message))
205235
}
206236
}

0 commit comments

Comments
 (0)