diff --git a/src/snek/system/terminal.py b/src/snek/system/terminal.py index 2d9341e..0b012ba 100644 --- a/src/snek/system/terminal.py +++ b/src/snek/system/terminal.py @@ -16,6 +16,7 @@ class TerminalSession: def __init__(self,command): self.master, self.slave = pty.openpty() self.sockets =[] + self.buffer = b'' self.process = subprocess.Popen( command.split(" "), stdin=self.slave, @@ -29,17 +30,30 @@ class TerminalSession: loop = asyncio.get_event_loop() self.sockets.append(ws) if len(self.sockets) > 1: + start = self.buffer.index(b'\n') + await ws.send_bytes(self.buffer[start:]) return while True: try: data = await loop.run_in_executor(None, os.read, self.master, 1024) if not data: break + self.buffer += data + if len(self.buffer) > 10000: + self.buffer = self.buffer[:-10000] try: for ws in self.sockets: await ws.send_bytes(data) # Send raw bytes for ANSI support except: self.sockets.remove(ws) except Exception: + print("Terminating process") + self.process.terminate() + print("Terminated process") + for ws in self.sockets: + try: + await ws.close() + except Exception: + pass break async def write_input(self, data): diff --git a/src/snek/templates/terminal.html b/src/snek/templates/terminal.html index f1d4e14..335a85f 100644 --- a/src/snek/templates/terminal.html +++ b/src/snek/templates/terminal.html @@ -11,7 +11,8 @@ <script src="https://cdn.jsdelivr.net/npm/xterm/lib/xterm.js"></script> <script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit/lib/xterm-addon-fit.js"></script> <style> - #terminal { width: 100%; height: 480px; overflow-y: none; } + #terminal { margin-right: 5%; width: 90%; height: 90%; overflow-y: none; } + #terminal::-webkit-scrollbar { display: none; } </style> <div class="container" id="terminal"></div>