from __future__ import annotations import time from collections import deque from dataclasses import dataclass, field @dataclass class WsLogEntry: conn_id: str session_id: str channel_id: str | None = None account_id: str | None = None address: str = "" timestamp: float = field(default_factory=time.time) action: str = "" details: dict = field(default_factory=dict) class WsLogger: def __init__(self, max_entries: int = 1000): self.entries: deque[WsLogEntry] = deque(maxlen=max_entries) def log( self, *, conn_id: str = "", session_id: str = "", channel_id: str | None = None, account_id: str | None = None, address: str = "", action: str = "", details: dict | None = None, ) -> None: self.entries.append( WsLogEntry( conn_id=conn_id, session_id=session_id, channel_id=channel_id, account_id=account_id, address=address, action=action, details=details or {}, ) ) def recent(self, n: int = 100) -> list[WsLogEntry]: entries = list(self.entries) return entries[-n:] def clear(self) -> None: self.entries.clear()