
    i.                    D   d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZmZmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z& ddl'm(Z(  G d dej)                  Z* G d de*          Z+ddZ,dS )a  
Main orchestrator for the Connect WebSocket connection.

This module provides the primary entry point for establishing and managing
persistent WebSocket connections between the SDK and the Inngest server.

Thread ownership:
    This module contains only main-thread concerns: public API, signal
    handling, thread creation, and bridging into the internal thread.
    Internal-thread logic (WebSocket lifecycle, message handling, shutdown
    coordination) lives in `isolated_worker.py`.
    )annotationsN)comm_libconstnet
server_lib   )get_max_worker_concurrency)ConnInitHandler)DEFAULT_SHUTDOWN_SIGNALS	FRAMEWORKHEARTBEAT_INTERVAL_SEC)DrainHandler)UnreachableError)ExecutionHandler)HeartbeatHandler)InitHandshakeHandler)IsolatedWorker)	AppConfigConnectionStateState)ValueWatcherc                  H    e Zd ZdZddddZdd	ZddZddZddZddZ	dS )WorkerConnectionz8
    Connection between the SDK and Inngest server.
    Fwaitr   boolreturnNonec               
   K   dS )z
        Close the connection.

        Args:
        ----
            wait: If True, wait for the connection to finish closing.
        N selfr   s     a/root/projects/qq-shell/venv/lib/python3.11/site-packages/inngest/connect/_internal/connection.pyclosezWorkerConnection.close1   s       	    c                
   K   dS )z<
        Wait for the connection to finish closing.
        Nr    r"   s    r#   closedzWorkerConnection.closed;          	r%   strc                    dS )z(
        Get the connection ID.
        Nr    r'   s    r#   get_connection_idz"WorkerConnection.get_connection_idA   	     	r%   r   c                    dS )z+
        Get the connection state.
        Nr    r'   s    r#   	get_statezWorkerConnection.get_stateG   r-   r%   c                
   K   dS )zN
        Start the connection. Blocks until the connection is closed.
        Nr    r'   s    r#   startzWorkerConnection.startM   r)   r%   statec                
   K   dS )zD
        Wait for the connection to reach a specific state.
        Nr    r"   r2   s     r#   wait_for_statezWorkerConnection.wait_for_stateS   r)   r%   Nr   r   r   r   r   r   r   r*   r   r   r2   r   r   r   )
__name__
__module____qualname____doc__r$   r(   r,   r/   r1   r5   r    r%   r#   r   r   ,   s          +0                       r%   r   c                      e Zd ZU dZded<   dZded<   ddddedd$dZd%dZd&dZ	d'dZ
d(dZddd)d!Zd(d"Zd(d#ZdS )*WorkerConnectionImplNz asyncio.AbstractEventLoop | None_loopzthreading.Thread | None_thread)instance_idrewrite_gateway_endpointshutdown_signalsmax_worker_concurrency!_test_only_heartbeat_interval_secapps@list[tuple[inngest.Inngest, list[inngest.Function[typing.Any]]]]rC   
str | NonerD   "typing.Callable[[str], str] | NonerE   list[signal.Signals] | NonerF   
int | NonerG   intr   r   c                   t          |          dk    rt          d          |d         d         }|j         _        |j         _        d  _        |t          }t          j	                    t          j
                    u r|D ]}t          j        | fd           n j                            d           d  _        |j        t          j        j        k    r|j         _        |j         _        i  _        i  _        |D ]}	|	\  }
}|
j        |j        k    rt          d          |
j        |j        k    rt          d          |
j        |j        k    rt          d          |
j        |j        k    rt          d          t/          j        d	d
 |D                       }t3          |t                    r|t5          ||
j                   j        |
j        <   t/          j        |
t<          |t>          j         j!                   j        |
j        <   |tE          j#                    }| _$        |tK                      }| _&        | _'        tQ          j)                    *                                 _+        tY          j-                     _.        d fd}t_          ta          d           ta          d           ta          tb          j2        |          ta          g           ta          d           ta          d           ta          d          ta          d          ta          d           	  	         _3        ti           j         j         j+         j.         j         j3         j         j                   _5        tm           j        |j         j+         j.         j         j'         j         j         j3        	  	        to           j         j3        |          tq           j         j3         j        |j         j$         j&                   j5        ts           j         j3                  g _:        tw           j:         j3         j                   _<        d S )Nr   zno apps providedc                ,                                     S N)_close)___r"   s     r#   <lambda>z/WorkerConnectionImpl.__init__.<locals>.<lambda>w   s     r%   z;Skipping signal handlers because this isn't the main threadz%inconsistent app config: API base URLzinconsistent app config: envzinconsistent app config: modez$inconsistent app config: signing keyzwss://connectc                    i | ]
}|j         |S r    )id).0fns     r#   
<dictcomp>z1WorkerConnectionImpl.__init__.<locals>.<dictcomp>   s    )))r)))r%   )	functionsversion)client	frameworkr[   	streaming	old_stater   	new_stater   r   c                Z    j                             d| j        |j        d           d S )NzConnection state changed)oldnew)extra)_loggerdebugvalue)r`   ra   r"   s     r#   on_conn_state_changez;WorkerConnectionImpl.__init__.<locals>.on_conn_state_change   sE     L*$?$?       r%   )	on_changeF)	conn_id	conn_init
conn_stateexclude_gatewaysextend_lease_intervalfatal_errorinit_handshake_completepending_request_countws)
api_origincomm_handlershttp_clienthttp_client_syncloggerr2   signing_keysigning_key_fallback)	rt   envrv   rw   rx   rD   ry   rz   r2   )rF   )handlersr2   rx   )r`   r   ra   r   r   r   )=len	Exceptionrx   rf   rt   _api_origin_signing_keyr   	threadingcurrent_threadmain_threadsignalrg   _fallback_signing_key_moder   
ServerKindCLOUDry   rz   _comm_handlers_app_configsr{   r   get_function_configs
isinstancer   app_versionapp_idCommHandlerr   r   	StreamingDISABLEsocketgethostname_instance_idr	   _max_worker_concurrency_rewrite_gateway_endpointr   ThreadAwareAsyncHTTPClient
initialize_http_clienthttpxClient_http_client_syncr   r   r   
CONNECTING_stater   _execution_handlerr
   r   r   r   	_handlersr   _isolated_worker)r"   rH   rC   rD   rE   rF   rG   default_clientsigar]   fnsconfigsri   s   `             r#   __init__zWorkerConnectionImpl.__init__^   s    t99>>.///a%,)4 #7
 #%%)>)@)@@@' @ @c#>#>#>#>????@ LM   &*":#8#>>> !/ :D)7)LD&?A24 	 	AMVS  N$=== GHHHz^/// >???|~333 ?@@@!^%??? FGGG3))S))) G '9-- /8!*0 0 0Dfm,
 2:1E#/1	2 2 2D..  ,..K'!)%?%A%A"'=$)A&:<<GGII!&
	 
	 
	 
	 
	 
	  &&"4((#*.   *"--".t"4"4$T**$0$7$7".q//D!!
 
 
 #3'-)!3<+)!%!;	#
 	#
 	#
 +"& -!%!7|)-)G -%)%?k
 
 
 1 
 !!"!'+'C   #t{335
: !/^+<!
 !
 !
r%   r*   c                J    | j         j        j        }|t          d          |S )Nzconnection not established)r   rk   rh   r~   )r"   rk   s     r#   r,   z&WorkerConnectionImpl.get_connection_id   s(    +%+?8999r%   r   c                $    | j         j        j        S rQ   )r   rm   rh   r'   s    r#   r/   zWorkerConnectionImpl.get_state  s    {%++r%   r2   c                T   K   | j         j                            |           d {V  d S rQ   )r   rm   wait_forr4   s     r#   r5   z#WorkerConnectionImpl.wait_for_state  s7      k$--e44444444444r%   c                   K   t          j                     j        _        t          j                     _        d d fd}t          j        |d           _         j        	                                  j
        j                            t          j                   d {V  t          j         j        j                   d {V   j                                         d {V   j                                         d S )Nr   r   c                 |   j         t          d          	 j                             j                                                   nD# t
          $ r7} | j        j                            t          j
        d            Y d } ~ nd } ~ ww xY wt          j                    d S # t          j                    w xY w)Nzloop is Nonec                "    | t           j        k    S rQ   )r   CLOSEDvs    r#   rU   zAWorkerConnectionImpl.start.<locals>.run_connect.<locals>.<lambda>  s    a?#99 r%   )rA   r   run_until_completer   runr~   r   rm   set_ifr   r   _shutdown_loop)er"   
thread_excs    r#   run_connectz/WorkerConnectionImpl.start.<locals>.run_connect  s    z!&~666+
--d.C.G.G.I.IJJJJ   
 &--#*99       	 tz*****tz****s/   1A 
B% 
B-BB% BB% %B;T)targetdaemonr7   )asyncioget_running_loopr   
_main_loopnew_event_looprA   r   ThreadrB   r1   r   rm   r   r   r   	to_threadjoinr   acloser   r$   )r"   r   r   s   ` @r#   r1   zWorkerConnectionImpl.start  s+     -4-E-G-G* +--
'+
	+ 	+ 	+ 	+ 	+ 	+ 	+" !'{4HHH k$--o.DEEEEEEEEE 1222222222&&((((((((($$&&&! "!r%   Fr   r   r   c               n   K   |                                   |r|                                  d {V  d S d S rQ   )rR   r(   r!   s     r#   r$   zWorkerConnectionImpl.close.  sK       	 ++--	  	 r%   c                    | j         j                            t          j        d           }|sdS | j        8	 | j                            | j        j                   dS # t          $ r Y dS w xY wdS )zD
        Must be sync since it's called in signal handlers.
        c                6    | t           j        t           j        fvS rQ   )r   CLOSINGr   r   s    r#   rU   z-WorkerConnectionImpl._close.<locals>.<lambda>;  s    a#+_-CDE r%   N)
r   rm   r   r   r   rA   call_soon_threadsafer   schedule_closeRuntimeError)r"   did_sets     r#   rR   zWorkerConnectionImpl._close4  s    
 +(//#E E
 

  	F:!
//)8          "!s   $A 
A,+A,c                   K   | j         j                            t          j                   d {V  | j        &t          j        | j        j                   d {V  d S d S rQ   )	r   rm   r   r   r   rB   r   r   r   r'   s    r#   r(   zWorkerConnectionImpl.closedK  sr      k$--o.DEEEEEEEEE<##DL$566666666666 $#r%   )rH   rI   rC   rJ   rD   rK   rE   rL   rF   rM   rG   rN   r   r   r8   r9   r:   r7   r6   )r;   r<   r=   rA   __annotations__rB   r   r   r,   r/   r5   r1   r$   rR   r(   r    r%   r#   r@   r@   Z   s
        .2E2222'+G++++ #'GK8<-11GZ
 Z
 Z
 Z
 Z
 Z
x   , , , ,5 5 5 5% % % %N +0               .7 7 7 7 7 7r%   r@   loopasyncio.AbstractEventLoopr   r   c                    	 t          j        |           }|D ]}|                                 	 |                                  dS # |                                  w xY w)z
    Cancel all remaining tasks on the loop and close it. Called from the worker
    thread after `run_until_complete` returns.
    N)r   	all_taskscancelr$   )r   pendingts      r#   r   r   R  s_    #D)) 	 	AHHJJJJ	 	



s   -A A)r   r   r   r   )-r>   
__future__r   r   r   r   r   typingr   inngestinngest._internalr   r   r   r   configs_libr	   conn_init_starterr
   constsr   r   r   drain_handlerr   errorsr   execution_handlerr   heartbeat_handlerr   init_handshake_handlerr   isolated_workerr   modelsr   r   r   value_watcherr   Protocolr   r@   r   r    r%   r#   <module>r      s    # " " " " "           > > > > > > > > > > > > 3 3 3 3 3 3 . . . . . .         
 ( ' ' ' ' ' $ $ $ $ $ $ / / / / / / / / / / / / 8 8 8 8 8 8 + + + + + + 5 5 5 5 5 5 5 5 5 5 ' ' ' ' ' '+ + + + +v + + +\u7 u7 u7 u7 u7+ u7 u7 u7p     r%   