77import asyncio
88import logging
99from collections import defaultdict
10- from collections .abc import Callable
10+ from collections .abc import Callable , Coroutine
1111from enum import Enum
1212from typing import Any
1313from weakref import WeakSet
@@ -89,22 +89,30 @@ class EventBus:
8989 - Weak references to prevent memory leaks
9090 """
9191
92- def __init__ (self ):
92+ def __init__ (self ) -> None :
9393 """Initialize EventBus."""
9494 # Use defaultdict for cleaner handler management
95- self ._handlers : dict [EventType , list [Callable ]] = defaultdict (list )
96- self ._once_handlers : dict [EventType , list [Callable ]] = defaultdict (list )
97- self ._wildcard_handlers : list [Callable ] = []
95+ self ._handlers : dict [
96+ EventType , list [Callable [[Event ], Coroutine [Any , Any , None ]]]
97+ ] = defaultdict (list )
98+ self ._once_handlers : dict [
99+ EventType , list [Callable [[Event ], Coroutine [Any , Any , None ]]]
100+ ] = defaultdict (list )
101+ self ._wildcard_handlers : list [Callable [[Event ], Coroutine [Any , Any , None ]]] = []
98102
99103 # Track active tasks to prevent garbage collection
100- self ._active_tasks : WeakSet = WeakSet ()
104+ self ._active_tasks : WeakSet [ asyncio . Task [ Any ]] = WeakSet ()
101105
102106 # Event history for debugging (optional, configurable)
103107 self ._history_enabled = False
104108 self ._event_history : list [Event ] = []
105109 self ._max_history_size = 1000
106110
107- async def on (self , event : EventType | str , handler : Callable ) -> None :
111+ async def on (
112+ self ,
113+ event : EventType | str ,
114+ handler : Callable [[Event ], Coroutine [Any , Any , None ]],
115+ ) -> None :
108116 """Register handler for event type.
109117
110118 Args:
@@ -119,7 +127,11 @@ async def on(self, event: EventType | str, handler: Callable) -> None:
119127 self ._handlers [event_type ].append (handler )
120128 logger .debug (f"Registered handler { handler .__name__ } for { event_type .value } " )
121129
122- async def once (self , event : EventType | str , handler : Callable ) -> None :
130+ async def once (
131+ self ,
132+ event : EventType | str ,
133+ handler : Callable [[Event ], Coroutine [Any , Any , None ]],
134+ ) -> None :
123135 """Register one-time handler for event type.
124136
125137 Handler will be automatically removed after first invocation.
@@ -138,7 +150,9 @@ async def once(self, event: EventType | str, handler: Callable) -> None:
138150 f"Registered one-time handler { handler .__name__ } for { event_type .value } "
139151 )
140152
141- async def on_any (self , handler : Callable ) -> None :
153+ async def on_any (
154+ self , handler : Callable [[Event ], Coroutine [Any , Any , None ]]
155+ ) -> None :
142156 """Register handler for all events.
143157
144158 Args:
@@ -151,7 +165,9 @@ async def on_any(self, handler: Callable) -> None:
151165 logger .debug (f"Registered wildcard handler { handler .__name__ } " )
152166
153167 async def off (
154- self , event : EventType | str | None = None , handler : Callable | None = None
168+ self ,
169+ event : EventType | str | None = None ,
170+ handler : Callable [[Event ], Coroutine [Any , Any , None ]] | None = None ,
155171 ) -> None :
156172 """Remove event handler(s).
157173
@@ -233,7 +249,9 @@ async def emit(
233249 for task in tasks :
234250 task .add_done_callback (self ._active_tasks .discard )
235251
236- async def _execute_handler (self , handler : Callable , event : Event ) -> None :
252+ async def _execute_handler (
253+ self , handler : Callable [[Event ], Coroutine [Any , Any , None ]], event : Event
254+ ) -> None :
237255 """Execute event handler with error handling.
238256
239257 Args:
@@ -274,9 +292,9 @@ async def wait_for(
274292 asyncio.TimeoutError: If timeout expires
275293 """
276294 event_type = event if isinstance (event , EventType ) else EventType (event )
277- future = asyncio .Future ()
295+ future : asyncio . Future [ Event ] = asyncio .Future ()
278296
279- async def handler (evt : Event ):
297+ async def handler (evt : Event ) -> None :
280298 if not future .done ():
281299 future .set_result (evt )
282300
0 commit comments