From fd54c253031893c2f3ea8282e19dbc76743fcdb2 Mon Sep 17 00:00:00 2001 From: imonlinux <39863321+imonlinux@users.noreply.github.com> Date: Sat, 11 Oct 2025 12:33:40 -0700 Subject: [PATCH] Introduces a simple, generic publish/subscribe event bus system. This decouples hardware components (like the LED controller) from the core application logic, allowing for a more modular and extensible design. --- linux_voice_assistant/event_bus.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/linux_voice_assistant/event_bus.py b/linux_voice_assistant/event_bus.py index 8ce5eca..55f2d9c 100644 --- a/linux_voice_assistant/event_bus.py +++ b/linux_voice_assistant/event_bus.py @@ -15,29 +15,28 @@ class EventBus: """ Subscribes a listener to a topic. """ - - # _LOGGER.debug(f'EventBus subscribe {topic}') - if topic not in self.topics: self.topics[topic] = [] self.topics[topic].append(listener) - def publish(self, topic: str, data: [dict, None]) -> None: + def publish(self, topic: str, data: Optional[Dict[str, Any]] = None) -> None: """ Publishes an event to all subscribed listeners. """ + if data is None: + data = {} - # _LOGGER.debug(f'EventBus publish {topic}') - data['__topic'] = topic listeners = self.topics.get(topic, []) for listener in listeners: - listener(data) + try: + listener(data) + except Exception: + _LOGGER.exception("Error in event listener for topic %s", topic) # Client helpers for subscriptions -# The decorator to mark methods for subscription. def subscribe(func: Callable) -> Callable: """Decorator to mark a method for event bus subscription.""" func._event_bus_subscribe = True @@ -46,15 +45,10 @@ def subscribe(func: Callable) -> Callable: class EventHandler: """ A base class for components that subscribe to events. - - Subclasses should define event handlers as methods decorated with `@subscribe`. - The method name will automatically be used as the event topic. """ - def __init__(self, state: Any): self.state = state self._subscribe_all_methods() - _LOGGER.debug(f"EventHandler {self.__class__.__name__} has subscribed to all decorated methods.") def _subscribe_all_methods(self): """Finds and subscribes all methods decorated with @subscribe.""" @@ -64,4 +58,4 @@ class EventHandler: if hasattr(method, '_event_bus_subscribe'): # The topic is the name of the method itself. self.state.event_bus.subscribe(method_name, method) - _LOGGER.debug(f"Subscribed method '{method_name}' to topic '{method_name}'") \ No newline at end of file + _LOGGER.debug(f"Subscribed method '{method_name}' to topic '{method_name}'")