| from collections import deque |
| from dataclasses import dataclass, field |
| from datetime import datetime |
| from typing import Any, Deque, Dict, Optional |
|
|
| from websocket import manager as ws_manager |
|
|
|
|
| @dataclass |
| class NS3State: |
| socket_path: str = "" |
| server_available: bool = False |
| client_connected: bool = False |
| total_messages: int = 0 |
| total_flows: int = 0 |
| last_event_at: Optional[str] = None |
| last_flow_at: Optional[str] = None |
| last_error: Optional[str] = None |
| events: Deque[Dict[str, Any]] = field(default_factory=lambda: deque(maxlen=200)) |
|
|
| def log(self, event_type: str, message: str, **extra: Any) -> None: |
| now = datetime.utcnow().isoformat() |
| event = {"timestamp": now, "type": event_type, "message": message, **extra} |
| self.last_event_at = now |
| self.events.appendleft(event) |
|
|
|
|
| flow_queue = None |
| ml_worker = None |
| ns3_reader = None |
| ns3_state = NS3State() |
|
|