| | 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) |
| |
|