53 lines
1.3 KiB
Python
53 lines
1.3 KiB
Python
|
|
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()
|