
    iA6                         d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ ddlmZ  ej                  e      Z G d d	e	      Z G d
 d      Z G d d      Zy)zEvent-driven architecture for ProjectX SDK v3.0.0.

This module provides a unified event system for all SDK components,
replacing scattered callback systems with a centralized event bus.
    N)defaultdict)Callable	Coroutine)Enum)Any)WeakSetc                       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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 )!	EventTypez+Unified event types for all SDK components.new_bardata_updatequote_update
trade_tickorderbook_updatemarket_depth_updateorder_placedorder_filledorder_partial_fillorder_cancelledorder_rejectedorder_expiredorder_modifiedposition_openedposition_closedposition_updatedposition_pnl_updaterisk_limit_warningrisk_limit_exceededstop_loss_triggeredtake_profit_triggered	connecteddisconnectedreconnectingauthenticatederrorwarningmemory_warningrate_limit_warninglatency_warningN)"__name__
__module____qualname____doc__NEW_BARDATA_UPDATEQUOTE_UPDATE
TRADE_TICKORDERBOOK_UPDATEMARKET_DEPTH_UPDATEORDER_PLACEDORDER_FILLEDORDER_PARTIAL_FILLORDER_CANCELLEDORDER_REJECTEDORDER_EXPIREDORDER_MODIFIEDPOSITION_OPENEDPOSITION_CLOSEDPOSITION_UPDATEDPOSITION_PNL_UPDATERISK_LIMIT_WARNINGRISK_LIMIT_EXCEEDEDSTOP_LOSS_TRIGGEREDTAKE_PROFIT_TRIGGERED	CONNECTEDDISCONNECTEDRECONNECTINGAUTHENTICATEDERRORWARNINGMEMORY_WARNINGRATE_LIMIT_WARNINGLATENCY_WARNING     O/home/work/apex_v16/venv/lib/python3.12/site-packages/project_x_py/event_bus.pyr
   r
      s    5 GK!LJ)/ "L!L-'O%N#M%N (O'O)/ .//3 I!L!L#MEG &N-'OrL   r
   c                   2    e Zd ZdZddeez  dededz  fdZy)EventzContainer for event data.Ntypedatasourcec                     |  t        |t              r|| _        n	 t        |      | _        || _        || _        t        j                         j                         | _	        y# t        $ r
 || _        Y Hw xY w)zInitialize event.

        Args:
            type: Event type (EventType enum or string)
            data: Event payload data
            source: Optional source component name
        N)

isinstancer
   rP   	ExceptionrQ   rR   asyncioget_running_looptime	timestamp)selfrP   rQ   rR   s       rM   __init__zEvent.__init__C   si     	dI&DI!%dO	 	 11388:  ! 	!s   A" "A54A5N)r)   r*   r+   r,   r
   strr   r[   rK   rL   rM   rO   rO   @   s'    #;Y_ ;C ;t ;rL   rO   c                      e Zd ZdZddZdeez  deege	e
e
df   f   ddfdZdedeez  deege	e
e
df   f   ddfd	Zdeez  deege	e
e
df   f   ddfd
Zdeege	e
e
df   f   ddfdZ	 	 ddeez  dz  deege	e
e
df   f   dz  ddfdZ	 ddeez  de
dedz  ddfdZdeege	e
e
df   f   deddfdZ	 ddeez  dedz  defdZddeddfdZdee   fdZddZddeez  dz  defdZddZy)EventBusa  Unified event system for all SDK components.

    Provides centralized event handling with support for:
    - Multiple handlers per event
    - One-time handlers
    - Wildcard event subscriptions
    - Async event emission
    - Weak references to prevent memory leaks
    returnNc                     t        t              | _        t        t              | _        g | _        t               | _        d| _        g | _        d| _	        t        t              | _
        y)zInitialize EventBus.F  N)r   list	_handlers_once_handlers_wildcard_handlersr   _active_tasks_history_enabled_event_history_max_history_size_legacy_handlersrZ   s    rM   r[   zEventBus.__init__f   sj    
  	
  	 WY :A !&+-!%
  	rL   eventhandlerc                 <  K   t        |t              r|n
t        |      }t        j                  |      st	        d|j
                   d      | j                  |   j                  |       t        j                  d|j
                   d|j                          yw)zRegister handler for event type.

        Args:
            event: Event type to listen for
            handler: Async callable to handle events
        Handler  must be asynczRegistered handler  for N)rT   r
   rV   iscoroutinefunction
ValueErrorr)   rd   appendloggerdebugvaluerZ   rm   rn   
event_types       rM   onzEventBus.on   s      )	:U	%@P
**73x(8(8'9HIIz"))'2*7+;+;*<E*BRBRASTU   BB_namec                   K   t        |t              r| j                  ||       d {    y t        j                  |      st        d|j                   d      | j                  t        |         j                  |       y 7 [w)Nrp   rq   )
rT   r
   r{   rV   rs   rt   r)   rk   r]   ru   )rZ   r}   rm   rn   s       rM   	subscribezEventBus.subscribe   sq      eY'''%)))..w7 8G,<,<+=^!LMM!!#e*-44W=	 *s   &BBABc                 <  K   t        |t              r|n
t        |      }t        j                  |      st	        d|j
                   d      | j                  |   j                  |       t        j                  d|j
                   d|j                          yw)zRegister one-time handler for event type.

        Handler will be automatically removed after first invocation.

        Args:
            event: Event type to listen for
            handler: Async callable to handle event once
        rp   rq   zRegistered one-time handler rr   N)rT   r
   rV   rs   rt   r)   re   ru   rv   rw   rx   ry   s       rM   oncezEventBus.once   s      )	:U	%@P
**73x(8(8'9HIIJ'..w7*7+;+;*<E*BRBRAST	
r|   c                    K   t        j                  |      st        d|j                   d      | j                  j                  |       t        j                  d|j                          yw)zqRegister handler for all events.

        Args:
            handler: Async callable to handle all events
        rp   rq   zRegistered wildcard handler N)rV   rs   rt   r)   rf   ru   rv   rw   )rZ   rn   s     rM   on_anyzEventBus.on_any   s`      **73x(8(8'9HII&&w/3G4D4D3EFGs   A-A/c                   K   |w| j                   j                          | j                  j                          || j                  j                          y| j                  D cg c]
  }||k7  s	| c}| _        yt	        |t
              r|n
t        |      }|;| j                   |   j                          | j                  |   j                          y| j                   |   D cg c]
  }||k7  s	| c}| j                   |<   | j                  |   D cg c]
  }||k7  s	| c}| j                  |<   yc c}w c c}w c c}w w)zRemove event handler(s).

        Args:
            event: Event type to remove handler from (None for all)
            handler: Specific handler to remove (None for all)
        N)rd   clearre   rf   rT   r
   )rZ   rm   rn   hrz   s        rM   offzEventBus.off   s%     =NN  "%%'''--/  $66+!w,A+' #-UI">IeDTJz*002##J/557  $~~j9.Q'\A.z*  $22:>3!w,A3##J/+.3s=   A"E$
D7/D73A4E'
D<2D<6!E
E"E& ErQ   rR   c                   K   t        |||      }| j                  rX| j                  j                  |       t	        | j                        | j
                  kD  r| j                  j                  d       g }t        |j                  t              r|j                  | j                  j                  |j                  g              | j                  j                  |j                  g       }|j                  |       |rXg | j                  |j                  <   n>|j                  | j                  j                  t        |j                        g              |j                  | j                          |rxg }|D ]S  }t#        j$                  | j'                  ||            }	| j(                  j+                  |	       |j                  |	       U t#        j,                  |ddi d{    yy7 w)zEmit event to all registered handlers.

        Args:
            event: Event type to emit
            data: Event payload data
            source: Optional source component name
        r   return_exceptionsTN)rO   rh   ri   ru   lenrj   poprT   rP   r
   extendrd   getre   rk   r]   rf   rV   create_task_execute_handlerrg   addgather)
rZ   rm   rQ   rR   	event_objhandlersonce_handlerstasksrn   tasks
             rM   emitzEventBus.emit   s     %v.	   &&y14&&'$*@*@@##''* HJ inni0OODNN..y~~rBC //33INNBGMOOM*68##INN3 OOD1155c)..6I2NO 	//0 -/E# #**4+@+@)+TU""&&t,T"# ..%@4@@@  As   G#G.%G,&G.c           	         K   	  ||       d{    y7 # t         $ r}t        |j                  t              r|j                  j                  nt        |j                        }t        j                  d|j                   d| d|        |j                  t        j                  k7  rG| j                  t        j                  ||j                  t        |      dd       d{  7   Y d}~yY d}~yd}~ww xY ww)zExecute event handler with error handling.

        Args:
            handler: Async callable to execute
            event: Event object to pass to handler
        NzError in event handler rr   z: )original_eventrn   r$   r_   )rR   )rU   rT   rP   r
   rx   r]   rv   r$   r)   rF   r   )rZ   rn   rm   eevent_type_strs        rM   r   zEventBus._execute_handler  s     	%.   	 ejj)4 

  _ 
 LL)'*:*:);5@PPRSTRUV zzY__,iiOO*8#*#3#3!$Q
 &      -	sC   C>  C> 	C;CC6&C)'C6,
C>6C;;C>timeoutc                 X  K   t        |t              r|n
t        |      }t        j                         dt        ddffd}| j                  ||       d{    	 t        j                  |       d{   S 7 $7 # t        $ r | j                  ||       d{  7    w xY ww)a  Wait for specific event to occur.

        Args:
            event: Event type to wait for
            timeout: Optional timeout in seconds

        Returns:
            Event object when received

        Raises:
            asyncio.TimeoutError: If timeout expires
        evtr`   Nc                 R   K   j                         sj                  |        y y wr\   )done
set_result)r   futures    rM   rn   z"EventBus.wait_for.<locals>.handlerK  s#     ;;=!!#& !s   $')r   )	rT   r
   rV   FuturerO   r   wait_forTimeoutErrorr   )rZ   rm   r   rz   rn   r   s        @rM   r   zEventBus.wait_for9  s      )	:U	%@P
(/(8	'u 	' 	' ii
G,,,	 ))&'BBB 	- C 	((:w///	sH   AB*A=B*B 8A?9B <B*?B B'B" B''B*max_sizec                 .    d| _         || _        g | _        y)zsEnable event history for debugging.

        Args:
            max_size: Maximum number of events to store
        TN)rh   rj   ri   )rZ   r   s     rM   enable_historyzEventBus.enable_historyX  s     !%!) rL   c                 6    | j                   j                         S )zkGet event history.

        Returns:
            List of recent events (empty if history disabled)
        )ri   copyrl   s    rM   get_historyzEventBus.get_historyb  s     ""''))rL   c                 8    | j                   j                          y)zClear event history.N)ri   r   rl   s    rM   clear_historyzEventBus.clear_historyj  s    !!#rL   c                    |t        d | j                  j                         D              }|t        d | j                  j                         D              z  }|t	        | j
                        z  }|t        d | j                  j                         D              z  }|S t        |t              rgt	        | j                  j                  |g             }|t	        | j                  j                  |g             z  }|t	        | j
                        z  }|S t	        | j                  j                  t        |      g             }|t	        | j
                        z  }|S )zGet number of registered handlers.

        Args:
            event: Event type to check (None for total)

        Returns:
            Number of handlers
        c              3   2   K   | ]  }t        |        y wr\   r   .0r   s     rM   	<genexpr>z-EventBus.get_handler_count.<locals>.<genexpr>x  s     N(HN   c              3   2   K   | ]  }t        |        y wr\   r   r   s     rM   r   z-EventBus.get_handler_count.<locals>.<genexpr>y  s     T8XTr   c              3   2   K   | ]  }t        |        y wr\   r   r   s     rM   r   z-EventBus.get_handler_count.<locals>.<genexpr>{  s     V8XVr   )sumrd   valuesre   r   rf   rk   rT   r
   r   r]   )rZ   rm   totalcounts       rM   get_handler_countzEventBus.get_handler_countn  s$    =Ndnn6K6K6MNNESTt7J7J7Q7Q7STTTES0011ESVt7L7L7S7S7UVVVEL%+DNN..ub9:T0044UB?@@T4455D1155c%j"EFT4455rL   c                 `   K   dt         ddffd}| j                  |       d{    y7 w)a>  
        Forward all events from this bus to the target bus.

        This sets up a wildcard handler that forwards all events to another EventBus,
        enabling event propagation from instrument-specific buses to the main suite bus.

        Args:
            target_bus: The EventBus to forward events to
        rm   r`   Nc                    K   j                  | j                  | j                  | j                         d{    y7 w)zForward event to target bus.N)r   rP   rQ   rR   )rm   
target_buss    rM   	forwarderz&EventBus.forward_to.<locals>.forwarder  s)     //%**ejj%,,GGGs   5A >A )rO   r   )rZ   r   r   s    ` rM   
forward_tozEventBus.forward_to  s1     	H5 	HT 	H kk)$$$s   #.,.)r`   N)NNr\   )rb   )r   r_   r`   N)r)   r*   r+   r,   r[   r
   r]   r   rO   r   r   r{   r   r   r   r   r   r   floatr   intr   rc   r   r   r   r   rK   rL   rM   r_   r_   [   s/   2V3V 5'9S#t^#<<=V 
	V(>> 3> 5'9S#t^#<<=	>
 
>
3
 5'9S#t^#<<=
 
	
.H3T>)B BCH	H  )-GK#3%# 5'9S#t^#<<=D# 
	#L GK,A_,A,/,A9<t,A	,A\3T>)B BCLQ	B ?C_/4t|	>!s !d !*T%[ *$y3'=  4%rL   r_   )r,   rV   loggingcollectionsr   collections.abcr   r   enumr   typingr   weakrefr   	getLoggerr)   rv   r
   rO   r_   rK   rL   rM   <module>r      sV      # /   			8	$+( +(\; ;6|% |%rL   