@@ -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.
1927func (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