34 lines
1.1 KiB
Python
34 lines
1.1 KiB
Python
"""Event system for inter-component communication."""
|
|
|
|
from typing import Callable, Any, Dict, List
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class EventBus:
|
|
"""Simple publish/subscribe event system."""
|
|
|
|
def __init__(self):
|
|
self._listeners: Dict[str, List[Callable]] = {}
|
|
|
|
def on(self, event: str, callback: Callable) -> None:
|
|
"""Subscribe to an event."""
|
|
self._listeners.setdefault(event, []).append(callback)
|
|
|
|
def off(self, event: str, callback: Callable) -> None:
|
|
"""Unsubscribe from an event."""
|
|
if event in self._listeners:
|
|
self._listeners[event] = [cb for cb in self._listeners[event] if cb != callback]
|
|
|
|
def emit(self, event: str, **data: Any) -> None:
|
|
"""Emit an event to all subscribers."""
|
|
for cb in self._listeners.get(event, []):
|
|
try:
|
|
cb(**data)
|
|
except Exception as e:
|
|
logger.error(f"Event handler error for '{event}': {e}")
|
|
|
|
def clear(self) -> None:
|
|
"""Remove all listeners."""
|
|
self._listeners.clear()
|