11package cmd
22
33import (
4+ "context"
45 "encoding/base64"
56 "fmt"
67 "io"
@@ -166,15 +167,29 @@ func streamExec(conn *websocket.Conn) error {
166167
167168 t := term .NewTerminal (os .Stdin , "" )
168169
170+ ctx , cancel := context .WithCancel (context .Background ())
171+
172+ stdin := make (chan string )
173+ defer close (stdin )
169174 go func () {
170175 for {
171- messageType , message , err := conn . ReadMessage ()
176+ line , err := t . ReadLine ()
172177 if err != nil {
178+ cancel ()
179+ break
180+ }
181+ stdin <- line
182+ }
183+ }()
184+
185+ go func () {
186+ for {
187+ messageType , message , err := conn .ReadMessage ()
188+ if err != nil || messageType == websocket .CloseMessage {
173189 if websocket .IsUnexpectedCloseError (err , websocket .CloseGoingAway , websocket .CloseNormalClosure ) {
174190 log .Printf ("error: %v" , err )
175191 }
176- break
177- } else if messageType == websocket .CloseMessage {
192+ cancel ()
178193 break
179194 } else {
180195 t .Write (message )
@@ -183,19 +198,15 @@ func streamExec(conn *websocket.Conn) error {
183198 }()
184199
185200 for {
186- line , err := t .ReadLine ()
187- if err != nil {
188- return err
189- }
190- if line == "exit" {
191- conn .WriteMessage (websocket .CloseMessage , websocket .FormatCloseMessage (websocket .CloseNormalClosure , "" ))
192- break
193- }
194- if err := conn .WriteMessage (websocket .TextMessage , []byte (line + "\n " )); err != nil {
195- break
201+ select {
202+ case <- ctx .Done ():
203+ return nil
204+ case line := <- stdin :
205+ if err := conn .WriteMessage (websocket .TextMessage , []byte (line + "\n " )); err != nil {
206+ return nil
207+ }
196208 }
197209 }
198- return nil
199210}
200211
201212func parseType (target string , appID string ) (string , string ) {
0 commit comments