Terminal changes.
This commit is contained in:
parent
0bc24e8d2e
commit
c2d9af807a
src/snek
@ -16,6 +16,7 @@ class TerminalSession:
|
|||||||
def __init__(self,command):
|
def __init__(self,command):
|
||||||
self.master, self.slave = pty.openpty()
|
self.master, self.slave = pty.openpty()
|
||||||
self.sockets =[]
|
self.sockets =[]
|
||||||
|
self.buffer = b''
|
||||||
self.process = subprocess.Popen(
|
self.process = subprocess.Popen(
|
||||||
command.split(" "),
|
command.split(" "),
|
||||||
stdin=self.slave,
|
stdin=self.slave,
|
||||||
@ -29,17 +30,30 @@ class TerminalSession:
|
|||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_event_loop()
|
||||||
self.sockets.append(ws)
|
self.sockets.append(ws)
|
||||||
if len(self.sockets) > 1:
|
if len(self.sockets) > 1:
|
||||||
|
start = self.buffer.index(b'\n')
|
||||||
|
await ws.send_bytes(self.buffer[start:])
|
||||||
return
|
return
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
data = await loop.run_in_executor(None, os.read, self.master, 1024)
|
data = await loop.run_in_executor(None, os.read, self.master, 1024)
|
||||||
if not data:
|
if not data:
|
||||||
break
|
break
|
||||||
|
self.buffer += data
|
||||||
|
if len(self.buffer) > 10000:
|
||||||
|
self.buffer = self.buffer[:-10000]
|
||||||
try:
|
try:
|
||||||
for ws in self.sockets: await ws.send_bytes(data) # Send raw bytes for ANSI support
|
for ws in self.sockets: await ws.send_bytes(data) # Send raw bytes for ANSI support
|
||||||
except:
|
except:
|
||||||
self.sockets.remove(ws)
|
self.sockets.remove(ws)
|
||||||
except Exception:
|
except Exception:
|
||||||
|
print("Terminating process")
|
||||||
|
self.process.terminate()
|
||||||
|
print("Terminated process")
|
||||||
|
for ws in self.sockets:
|
||||||
|
try:
|
||||||
|
await ws.close()
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
break
|
break
|
||||||
|
|
||||||
async def write_input(self, data):
|
async def write_input(self, data):
|
||||||
|
@ -11,7 +11,8 @@
|
|||||||
<script src="https://cdn.jsdelivr.net/npm/xterm/lib/xterm.js"></script>
|
<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>
|
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit/lib/xterm-addon-fit.js"></script>
|
||||||
<style>
|
<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>
|
</style>
|
||||||
|
|
||||||
<div class="container" id="terminal"></div>
|
<div class="container" id="terminal"></div>
|
||||||
|
Loading…
Reference in New Issue
Block a user