
    R߰j;                        d Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
mZmZ ddlmZ  ej                  e      Z G d dee      Ze G d d	             Z G d
 d      ZddedefdZedk(  r\ e       Z eej2                  d      defd       Z eej6                  d      defd       Zd Z ej<                   e              yy)uo   
Event Bus - 松耦合事件总线模块

用于 Agent 各组件之间的通信，实现发布/订阅模式。
    N)DictCallableListAnyOptional)	dataclassfield)Enumc                   X    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZy)	EventTypeu   事件类型枚举dialogue_startdialogue_enduser_speechassistant_speech	interruptaudio_frameaudio_segmentaudio_playingaudio_stoppedmemory_extractedmemory_savedconflict_detectedvision_framescene_identifiedsystem_errorcomponent_readycomponent_errorhealth_checkN)__name__
__module____qualname____doc__DIALOGUE_STARTDIALOGUE_ENDUSER_SPEECHASSISTANT_SPEECH	INTERRUPTAUDIO_FRAMEAUDIO_SEGMENTAUDIO_PLAYINGAUDIO_STOPPEDMEMORY_EXTRACTEDMEMORY_SAVEDCONFLICT_DETECTEDVISION_FRAMESCENE_IDENTIFIEDSYSTEM_ERRORCOMPONENT_READYCOMPONENT_ERRORHEALTH_CHECK     event_bus.pyr   r      sk    %N!LK)I  K#M#M#M *!L+ "L) "L'O'O!Lr6   r   c                       e Zd ZU dZeed<    ee      Ze	e
ef   ed<    eej                        Zeed<   dZe
ed<   dZeed	<   y
)EventBusEventu   事件总线事件type)default_factorydata	timestampunknownsourcer   priorityN)r   r    r!   r"   r   __annotations__r	   dictr<   r   strr   timer=   floatr?   r@   intr5   r6   r7   r9   r9   1   sH    
O 6D$sCx.6TYY7Iu7FCHcr6   r9   c            	           e Zd ZdZddefdZddededefdZ	dedefdZ
	 dded	eeef   d
edefdZd Zd Zd Zdeeef   fdZd Zy)EventBusu-   事件总线 - 支持同步和异步处理器max_queue_sizec                     i | _         i | _        t        j                  |      | _        d| _        d | _        dddd| _        y )N)maxsizeFr   )	published	processederrors)	_handlers_async_handlersasyncioQueue_queue_running_task_stats)selfrI   s     r7   __init__zEventBus.__init__>   sA    :<@B%,]]>%J-1

r6   
event_typehandleris_asyncc                    |ra|| j                   vrg | j                   |<   | j                   |   j                  |       t        j                  d| d|j                          y|| j
                  vrg | j
                  |<   | j
                  |   j                  |       t        j                  d| d|j                          y)u   
        订阅事件
        
        Args:
            event_type: 事件类型
            handler: 处理函数（同步或异步）
            is_async: 是否异步处理
        u   📡 异步订阅: u    ← u   📡 同步订阅: N)rP   appendloggerdebugr   rO   )rW   rY   rZ   r[   s       r7   	subscribezEventBus.subscribeJ   s     !5!5535$$Z0  ,33G<LL.zl%@P@P?QRS/-/z*NN:&--g6LL.zl%@P@P?QRSr6   c                     || j                   v r/|| j                   |   v r| j                   |   j                  |       || j                  v r1|| j                  |   v r| j                  |   j                  |       yyy)u   取消订阅N)rO   removerP   )rW   rY   rZ   s      r7   unsubscribezEventBus.unsubscribe^   sx    'Gt~~j7Q,QNN:&--g6---'T=Q=QR\=]2]  ,33G< 3^-r6   r<   r?   r@   c                    t        ||||      }|| j                  v r| j                  |   D ]  }	  ||        || j                  v r| j                  j                  |       | j                  dxx   dz  cc<   t        j                  d| d	| d
       y# t        $ rF}t        j	                  d|j
                   d|        | j                  dxx   dz  cc<   Y d}~d}~ww xY w)u   
        发布事件
        
        Args:
            event_type: 事件类型
            data: 事件数据
            source: 事件来源
            priority: 优先级
        )r:   r<   r?   r@   u   ❌ 同步处理器错误:  - rN      NrL   u   📨 发布事件: u
    (来源: ))r9   rO   	Exceptionr^   errorr   rV   rP   rS   
put_nowaitr_   )rW   rY   r<   r?   r@   eventrZ   es           r7   publishzEventBus.publishe   s     	
 '>>*5/EN 6 ---KK""5)K A% *:,jJK ! /LL#>w?O?O>PPSTUSV!WXKK)Q.))/s   B	C'!<C""C'c                    K   d| _         t        j                  | j                               | _        t
        j                  d       yw)u   启动事件处理器Tu   ✅ 事件总线已启动N)rT   rQ   create_task_process_queuerU   r^   inforW   s    r7   startzEventBus.start   s5     (()<)<)>?
/0s   AAc                    K   d| _         | j                  r/| j                  j                          	 | j                   d{    t
        j                  d       y7 # t        j                  $ r Y -w xY ww)u   停止事件处理器FNu   ⏹️ 事件总线已停止)rT   rU   cancelrQ   CancelledErrorr^   rq   rr   s    r7   stopzEventBus.stop   sa     ::JJjj   	23 !)) s:   .A6A  AA A6A A30A62A33A6c                 (  K   | j                   r	 t        j                  | j                  j	                         d       d{   }|j
                  | j                  v rF| j                  |j
                     D ]*  }	  ||       d{    | j                  dxx   dz  cc<   , | j                  j                          | j                   ryy7 7 H# t        $ rF}t        j                  d|j                   d|        | j                  dxx   dz  cc<   Y d}~d}~ww xY w# t        j                  $ r Y 7t        j                  $ r Y yt        $ r9}t        j                  d	|        | j                  dxx   dz  cc<   Y d}~d}~ww xY ww)
u   处理异步事件队列g?)timeoutNrM   rf   u   ❌ 异步处理器错误: re   rN   u   ❌ 事件队列处理错误: )rT   rQ   wait_forrS   getr:   rP   rV   rh   r^   ri   r   	task_doneTimeoutErrorrv   )rW   rk   rZ   rl   s       r7   rp   zEventBus._process_queue   sP    mm+%..t{{/@#NN::!5!55#'#7#7

#C7")%.00 KK494 $D %%' mmN
 1( 7"LL+FwGWGWFXX[\][^)_` KK1Q6117 '' ))  +=aSABH%*%%+s   F2D$ C8D$ <CCC#D$ ?FFD$ C	D!<DD$ D!!D$ $F7F:FFF/F
F
FFreturnc                 6    | j                   j                         S )u   获取统计信息)rV   copyrr   s    r7   	get_statszEventBus.get_stats   s    {{!!r6   c                     | j                   j                          | j                  j                          t        j	                  d       y)u   清空所有处理器u#   🧹 已清空所有事件处理器N)rO   clearrP   r^   rq   rr   s    r7   clear_handlerszEventBus.clear_handlers   s1    ""$9:r6   N)i  F)r>   r   )r   r    r!   r"   rF   rX   r   r   boolr`   rc   r   rC   r   rm   rs   rw   rp   r   r   r5   r6   r7   rH   rH   ;   s    7

s 

TI T TD T(=i =( = :; L)  L4S>  L L36 LD1	4+2"4S> ";r6   rH   rY   async_handlerc                 0     dt         dt         f fd}|S )u   
    事件处理器装饰器
    
    Usage:
        @on_event(EventType.USER_SPEECH, async_handler=True)
        async def handle_speech(event: EventBusEvent):
            pass
    funcr~   c                 $    | _         | _        | S )N)_event_handler_async_handler)r   r   rY   s    r7   	decoratorzon_event.<locals>.decorator   s    (+r6   )r   )rY   r   r   s   `` r7   on_eventr      s     X  r6   __main__T)r   rk   c                 Z   K   t        d| j                  j                  d              y w)Nu   🎤 收到语音: textprintr<   r{   rk   s    r7   handle_speechr      s$     #EJJNN6$:#;<=   )+c                 Z   K   t        d| j                  j                  d              y w)Nu   🔊 回复: r   r   r   s    r7   handle_replyr      s#     ejjnnV4567r   c                    K   t         j                          d {    t         j                  t        j                  ddi       t         j                  t        j
                  ddi       t        j                  d       d {    t         j                          d {    t        dt         j                                 y 7 7 C7 )w)Nr   u   你好u$   你好！有什么可以帮你的？rf   u	   
统计: )busrs   rm   r   r%   r&   rQ   sleeprw   r   r   r5   r6   r7   mainr      s     iik 	I))FH+=>I..9_0`ammAhhj
3==?+,- 	 	s4   CCA(CCCC	 &CC	Cr   )r"   rQ   loggingrD   typingr   r   r   r   r   dataclassesr   r	   enumr
   	getLoggerr   r^   rC   r   r9   rH   r   r   r   r%   r   r&   r   r   runr5   r6   r7   <module>r      s       6 6 ( 			8	$"T ">   ~; ~;F 4 $ z
*Ci##48>= > 9> i((=8- 8 >8
. GKK1 r6   