parent
							
								
									a3b2e0026d
								
							
						
					
					
						commit
						a5e826e284
					
				|  | @ -57,7 +57,10 @@ func main() { | |||
| 		Addr:    flagAddr, | ||||
| 		Handler: Middleware(g), | ||||
| 	} | ||||
| 	server.ListenAndServe() | ||||
| 	err := server.ListenAndServe() | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func Middleware(next http.Handler) http.Handler { | ||||
|  |  | |||
							
								
								
									
										14
									
								
								gterm.go
								
								
								
								
							
							
						
						
									
										14
									
								
								gterm.go
								
								
								
								
							|  | @ -9,7 +9,6 @@ import ( | |||
| 	"os" | ||||
| 	"os/exec" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/creack/pty" | ||||
|  | @ -78,7 +77,6 @@ func New() *GTerm { | |||
| 			log.Info("current connections: ", cons) | ||||
| 			time.Sleep(5 * time.Minute) | ||||
| 		} | ||||
| 
 | ||||
| 	}() | ||||
| 	return >erm{ | ||||
| 		AppName:    "GTERM", | ||||
|  | @ -165,8 +163,7 @@ func (g *GTerm) WS(w http.ResponseWriter, r *http.Request) { | |||
| 	}() | ||||
| 
 | ||||
| 	var connectionClosed bool | ||||
| 	var waiter sync.WaitGroup | ||||
| 	waiter.Add(1) | ||||
| 	waiter := make(chan struct{}, 1) | ||||
| 
 | ||||
| 	// this is a keep-alive loop that ensures connection does not hang-up itself
 | ||||
| 	lastPongTime := time.Now() | ||||
|  | @ -183,7 +180,7 @@ func (g *GTerm) WS(w http.ResponseWriter, r *http.Request) { | |||
| 			time.Sleep(g.Timeout / 2) | ||||
| 			if time.Since(lastPongTime) > g.Timeout { | ||||
| 				l.Warn("failed to get response from ping, triggering disconnect now...") | ||||
| 				waiter.Done() | ||||
| 				waiter <- struct{}{} | ||||
| 				return | ||||
| 			} | ||||
| 			l.Debug("received response from ping successfully") | ||||
|  | @ -198,7 +195,7 @@ func (g *GTerm) WS(w http.ResponseWriter, r *http.Request) { | |||
| 			// can be terminated - this frees up memory so the service doesn't get
 | ||||
| 			// overloaded
 | ||||
| 			if errorCounter > g.ErrorLimit { | ||||
| 				waiter.Done() | ||||
| 				waiter <- struct{}{} | ||||
| 				break | ||||
| 			} | ||||
| 			buffer := make([]byte, g.BufferSize) | ||||
|  | @ -208,7 +205,7 @@ func (g *GTerm) WS(w http.ResponseWriter, r *http.Request) { | |||
| 				if err := conn.WriteMessage(websocket.TextMessage, []byte("bye!")); err != nil { | ||||
| 					l.Warn("failed to send termination message from tty to xterm.js: ", err) | ||||
| 				} | ||||
| 				waiter.Done() | ||||
| 				waiter <- struct{}{} | ||||
| 				return | ||||
| 			} | ||||
| 			if err := conn.WriteMessage(websocket.BinaryMessage, buffer[:readLength]); err != nil { | ||||
|  | @ -276,7 +273,8 @@ func (g *GTerm) WS(w http.ResponseWriter, r *http.Request) { | |||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| 	waiter.Wait() | ||||
| 	<-waiter | ||||
| 	close(waiter) | ||||
| 	l.Info("closing connection...") | ||||
| 	connectionClosed = true | ||||
| } | ||||
|  |  | |||
							
								
								
									
										19
									
								
								main.js
								
								
								
								
							
							
						
						
									
										19
									
								
								main.js
								
								
								
								
							|  | @ -8,13 +8,13 @@ import 'xterm/css/xterm.css' | |||
| 
 | ||||
| (function() { | ||||
|     const terminal = new Terminal({ | ||||
|       screenKeys: true, | ||||
|       useStyle: true, | ||||
|       cursorBlink: true, | ||||
|       fullscreenWin: true, | ||||
|       maximizeWin: true, | ||||
|       screenReaderMode: true, | ||||
|       cols: 128, | ||||
|       // screenKeys: true,
 | ||||
|       // useStyle: true,
 | ||||
|       // cursorBlink: true,
 | ||||
|       // fullscreenWin: true,
 | ||||
|       // maximizeWin: true,
 | ||||
|       // screenReaderMode: true,
 | ||||
|       // cols: 128,
 | ||||
|     }); | ||||
|     const fitAddon = new FitAddon(); | ||||
|     terminal.loadAddon(fitAddon); | ||||
|  | @ -29,7 +29,6 @@ import 'xterm/css/xterm.css' | |||
|     const serializeAddon = new SerializeAddon(); | ||||
|     terminal.loadAddon(serializeAddon); | ||||
|     terminal.open(document.getElementById("terminal")); | ||||
|     fitAddon.fit(); | ||||
|     ws.onclose = function(event) { | ||||
|       console.log(event); | ||||
|       terminal.write('\r\n\nconnection has been terminated from the server-side (hit refresh to restart)\n') | ||||
|  | @ -39,6 +38,9 @@ import 'xterm/css/xterm.css' | |||
|       terminal._initialized = true; | ||||
|       terminal.focus(); | ||||
|       setTimeout(function() {fitAddon.fit()}); | ||||
|       document.addEventListener('keypress',(e)=>{ | ||||
|         e.preventDefault(); | ||||
|       }) | ||||
|       terminal.onResize(function(event) { | ||||
|         var rows = event.rows; | ||||
|         var cols = event.cols; | ||||
|  | @ -54,5 +56,6 @@ import 'xterm/css/xterm.css' | |||
|         console.log("resize") | ||||
|         fitAddon.fit(); | ||||
|       }; | ||||
|       fitAddon.fit(); | ||||
|     }; | ||||
|   })(); | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -1 +1 @@ | |||
| <!DOCTYPE html><html><head><link rel="stylesheet" href="index.6999253a.css"><title>{{.AppName}}</title><style>body::-webkit-scrollbar,div::-webkit-scrollbar,html::-webkit-scrollbar{display:none;width:0}body,html{margin:0;overflow:hidden;padding:0}div#terminal{height:100%;left:0;position:absolute;top:0;width:100%}div#terminal div{height:100%}.xterm-screen,.xterm-viewport{height:100%;margin:0;padding:0}</style></head><body> <div id="terminal"></div> <script type="module" src="index.b28ecb90.js"></script> </body></html> | ||||
| <!DOCTYPE html><html><head><link rel="stylesheet" href="index.6999253a.css"><title>{{.AppName}}</title><style>body::-webkit-scrollbar,div::-webkit-scrollbar,html::-webkit-scrollbar{display:none;width:0}body,html{margin:0;overflow:hidden;padding:0}div#terminal{height:100%;left:0;position:absolute;top:0;width:100%}div#terminal div{height:100%}.xterm-screen,.xterm-viewport{height:100%;margin:0;padding:0}</style></head><body> <div id="terminal"></div> <script type="module" src="index.52560dc1.js"></script> </body></html> | ||||
		Loading…
	
		Reference in New Issue