| from app.logger import on_flush
|
| import os
|
| import shutil
|
|
|
|
|
| class TerminalService:
|
| def __init__(self, server):
|
| self.server = server
|
| self.cols = None
|
| self.rows = None
|
| self.subscriptions = set()
|
| on_flush(self.send_messages)
|
|
|
| def get_terminal_size(self):
|
| try:
|
| size = os.get_terminal_size()
|
| return (size.columns, size.lines)
|
| except OSError:
|
| try:
|
| size = shutil.get_terminal_size()
|
| return (size.columns, size.lines)
|
| except OSError:
|
| return (80, 24)
|
|
|
| def update_size(self):
|
| columns, lines = self.get_terminal_size()
|
| changed = False
|
|
|
| if columns != self.cols:
|
| self.cols = columns
|
| changed = True
|
|
|
| if lines != self.rows:
|
| self.rows = lines
|
| changed = True
|
|
|
| if changed:
|
| return {"cols": self.cols, "rows": self.rows}
|
|
|
| return None
|
|
|
| def subscribe(self, client_id):
|
| self.subscriptions.add(client_id)
|
|
|
| def unsubscribe(self, client_id):
|
| self.subscriptions.discard(client_id)
|
|
|
| def send_messages(self, entries):
|
| if not len(entries) or not len(self.subscriptions):
|
| return
|
|
|
| new_size = self.update_size()
|
|
|
| for client_id in self.subscriptions.copy():
|
| if client_id not in self.server.sockets:
|
|
|
| self.unsubscribe(client_id)
|
| continue
|
|
|
| self.server.send_sync("logs", {"entries": entries, "size": new_size}, client_id)
|
|
|