Ë
    :vžje-  ã                   ó   — d Z ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlZddlmZ ddlmZ ddlmZ dd	lmZ ed   Z G d
„ de«      Z G d„ de
«      Z ej2                  e«        G d„ d«      Z G d„ de«      Zy)zCBase classes to manage a Client's interaction with a running kernelé    N)ÚEmpty)ÚEventÚThread)Úensure_asyncé   )Úprotocol_version_info)ÚHBChannelABC)ÚSessionc                   ó   — e Zd ZdZy)ÚInvalidPortNumberz/An exception raised for an invalid port number.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úh/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_client/channels.pyr   r      s   „ Ù9àr   r   c                   óX  ‡ — e Zd ZU dZdZdZdZdZdZe	e
d<   dZdZdZ	 	 	 dddœdej                  dz  dedz  d	ej$                  ej&                  eef   ef   d
edz  ddf
ˆ fd„Zeej4                  dd„«       «       Zdd„Zdd„Zdd„Zdd„Zdd„Z de!fd„Z"dd„Z#dd„Z$de	ddfd„Z%ˆ xZ&S )Ú	HBChannelzôThe heartbeat channel which monitors the kernel heartbeat.

    Note that the heartbeat channel is paused by default. As long as you start
    this channel, the kernel manager will ensure that it is paused and un-paused
    as appropriate.
    NFg      ð?Útime_to_dead)Úcurve_serverkeyÚcontextÚsessionÚaddressr   Úreturnc                ó.  •— t         ‰| �  «        d| _        || _        || _        || _        t        |t        «      r|d   dk(  rd}t        |«      ‚d|z  }n|}|| _	        d| _
        t        «       | _        d| _        t        j                  «       | _        y)a<  Create the heartbeat monitor thread.

        Parameters
        ----------
        context : :class:`zmq.Context`
            The ZMQ context to use.
        session : :class:`session.Session`
            The session to use.
        address : zmq url
            Standard (ip, port) tuple that the kernel is listening on.
        curve_serverkey : bytes, optional
            CurveZMQ server public key (Z85). When provided, the
            heartbeat REQ socket is configured as a CurveZMQ client so it
            can communicate with a CurveZMQ-enabled kernel.
        Tr   r   z*The port number for a channel cannot be 0.ztcp://%s:%iFN)ÚsuperÚ__init__Údaemonr   r   r   Ú
isinstanceÚtupler   r   Ú_runningr   Ú_exitÚ_pauseÚzmqÚPollerÚpoller)Úselfr   r   r   r   ÚmessageÚaddress_strÚ	__class__s          €r   r   zHBChannel.__init__5   sŽ   ø€ ô. 	‰ÑÔØˆŒàˆŒØˆŒØ.ˆÔÜ�gœuÔ%Ø�q‰z˜QŠØF�Ü'¨Ó0Ð0Ø'¨'Ñ1‰Kà!ˆKØ"ˆŒð ˆŒÜ“WˆŒ
àˆŒÜ—j‘j“lˆ�r   c                  ó(   — t         �dt         _        y y )NT)r   Ú_exitingr   r   r   Ú_notice_exitzHBChannel._notice_exitb   s   € ô
 Ð Ø!%ŒIÕð !r   c                 óÂ  — | j                   �?| j                  j                  | j                   «       | j                   j                  «        | j                  €J ‚| j                  j                  t
        j                  «      | _         d| j                   _        | j                  �Tt        j                  «       \  }}|| j                   _
        || j                   _        | j                  | j                   _        | j                  €J ‚| j                   j                  | j                  «       | j                  j                  | j                   t
        j                  «       y )Néè  )Úsocketr'   Ú
unregisterÚcloser   r%   ÚREQÚlingerr   Úcurve_keypairÚcurve_secretkeyÚcurve_publickeyr   ÚconnectÚregisterÚPOLLIN)r(   Ú
client_pubÚ
client_secs      r   Ú_create_socketzHBChannel._create_socketj   sõ   € Ø�;‰;Ð"à�K‰K×"Ñ" 4§;¡;Ô/Ø�K‰K×ÑÔØ�|‰|Ð'Ð'Ð'Ø—l‘l×)Ñ)¬#¯'©'Ó2ˆŒØ!ˆ�‰ÔØ×ÑÐ+ô &)×%6Ñ%6Ó%8Ñ"ˆJ˜
Ø*4ˆD�K‰KÔ'Ø*4ˆD�K‰KÔ'Ø*.×*>Ñ*>ˆD�K‰KÔ'Ø�|‰|Ð'Ð'Ð'Ø�‰×Ñ˜DŸL™LÔ)à�‰×Ñ˜TŸ[™[¬#¯*©*Õ5r   c              ƒ   ó&  K  — | j                  «        d| _        d| _        | j                  €J ‚| j                  �rP| j                  r&| j
                  j                  | j                  «       Œ?d}t        | j                  j                  d«      «      ƒ d{  –—†  t        j                  «       }| j
                  j                  | j                  «       t        | j                  j                  d«      «      | _        | j                  r-t        | j                  j                  «       «      ƒ d{  –—†  �Œ| j                  r:t        j                  «       |z
  }| j                  |«       | j                  «        �ŒN| j                  r�ŒOyy7 Œõ7 Œ^­w)z2The thread's main activity.  Call start() instead.TNg        s   pingr   )r>   r"   Ú_beatingr1   r$   r#   Úwaitr   r   ÚsendÚtimeÚboolr'   ÚpollÚrecvÚcall_handlers)r(   Úsince_last_heartbeatÚrequest_times      r   Ú
_async_runzHBChannel._async_run~   s'  è ø€ à×ÑÔØˆŒØˆŒØ�{‰{Ð&Ð&Ð&à�m‹mØ�{Š{à—
‘
—‘ × 1Ñ 1Ô2Øà#&Ð ô ˜tŸ{™{×/Ñ/°Ó8Ó9×9Ð9ÜŸ9™9›;ˆLà�J‰J�O‰O˜D×-Ñ-Ô.ä  §¡×!1Ñ!1°!Ó!4Ó5ˆDŒMØ�}Š}ä" 4§;¡;×#3Ñ#3Ó#5Ó6×6Ð6ÙØ—’ä'+§y¡y£{°\Ñ'AÐ$Ø×"Ñ"Ð#7Ô8à×#Ñ#Ô%Ùð3 �mŽmð :øð 7ús,   ‚BFÂFÂBFÄ0FÄ1AFÆFÆFc                 óà   — t        j                  «       }t        j                  |«       	 |j                  | j	                  «       «       |j                  «        y# |j                  «        w xY w)zRun the heartbeat thread.N)ÚasyncioÚnew_event_loopÚset_event_loopÚrun_until_completerJ   r3   )r(   Úloops     r   ÚrunzHBChannel.run    sK   € ä×%Ñ%Ó'ˆÜ×Ñ˜tÔ$ð	Ø×#Ñ# D§O¡OÓ$5Ô6à�J‰J�LøˆD�J‰J�Lús   «A ÁA-c                 ó   — d| _         y)zPause the heartbeat.TN©r$   ©r(   s    r   ÚpausezHBChannel.pause©   s	   € àˆ�r   c                 ó   — d| _         y)zUnpause the heartbeat.FNrS   rT   s    r   ÚunpausezHBChannel.unpause­   s	   € àˆ�r   c                 óV   — | j                  «       r| j                  s| j                  ryy)z9Is the heartbeat running and responsive (and not paused).TF)Úis_aliver$   r@   rT   s    r   Ú
is_beatingzHBChannel.is_beating±   s   € à�=‰=Œ? 4§;¢;°4·=²=Øàr   c                 ó†   — d| _         | j                  j                  «        | j                  «        | j	                  «        y)z2Stop the channel's event loop and join its thread.FN)r"   r#   ÚsetÚjoinr3   rT   s    r   ÚstopzHBChannel.stop¸   s)   € àˆŒØ�
‰
�‰ÔØ�	‰	ŒØ�
‰
�r   c                 ó„   — | j                   �%	 | j                   j                  d¬«       d| _         yy# t        $ r Y Œw xY w)zClose the heartbeat thread.Nr   ©r5   ©r1   r3   Ú	ExceptionrT   s    r   r3   zHBChannel.close¿   óH   € à�;‰;Ð"ðØ—‘×!Ñ!¨Ð!Ô+ð ˆD�Kð #øô ò Ùðúó   Ž3 ³	?¾?rH   c                  ó   — y)ai  This method is called in the ioloop thread when a message arrives.

        Subclasses should override this method to handle incoming messages.
        It is important to remember that this method is called in the thread
        so that some logic must be done to ensure that the application level
        handlers are called in the application thread.
        Nr   )r(   rH   s     r   rG   zHBChannel.call_handlersÈ   s   € ð 	r   )NNÚ ©r   N)'r   r   r   r   r   r1   r   r-   r   ÚfloatÚ__annotations__r"   r$   r@   r%   ÚContextr
   ÚtÚUnionÚTupleÚstrÚintÚbytesr   ÚstaticmethodÚatexitr:   r.   r>   rJ   rQ   rU   rW   rD   rZ   r^   r3   rG   Ú__classcell__©r+   s   @r   r   r   #   s  ø… ñð €GØ€FØ€GØ€Hà€L�%ÓØ€HØ€FØ€Hð '+Ø"&Ø35ð	+#ð )-ò+#à—‘˜tÑ#ð+#ð ˜4‘ð+#ð —‘˜Ÿ™  c Ñ*¨CÐ/Ñ0ð	+#ð  ™ð+#ð 
õ+#ðZ Ø‡_�_ò&ó ó ð&ó6ó( óDóóð˜Dó óóð°%ð ¸D÷ r   r   c            	       óÄ  ‡ — e Zd ZdZddej
                  dedej                  ddfˆ fd„Z	dej                  dej                  eej                  f   fd	„Zdd
edz  dej                  eej                  f   fd„Zdej                  ej                  eej                  f      fd„Zdefd„Zdd„ZeZdefd„Zdej                  eej                  f   ddfd„Zdd„Zˆ xZS )ÚZMQSocketChannelzA ZMQ socket wrapperNr1   r   rP   r   c                 ó>   •— t         ‰| �  «        || _        || _        y)a  Create a channel.

        Parameters
        ----------
        socket : :class:`zmq.Socket`
            The ZMQ socket to use.
        session : :class:`session.Session`
            The session to use.
        loop
            Unused here, for other implementations
        N)r   r   r1   r   )r(   r1   r   rP   r+   s       €r   r   zZMQSocketChannel.__init__Ù   s   ø€ ô 	‰ÑÔà)/ˆŒØˆ�r   Úkwargsc                 óÈ   — | j                   €J ‚ | j                   j                  di |¤Ž}| j                  j                  |«      \  }}| j                  j	                  |«      S ©Nr   ©r1   Úrecv_multipartr   Úfeed_identitiesÚdeserialize)r(   rx   ÚmsgÚ_identÚsmsgs        r   Ú_recvzZMQSocketChannel._recvê   sX   € Ø�{‰{Ð&Ð&Ð&Ø(ˆd�k‰k×(Ñ(Ñ2¨6Ñ2ˆØ—|‘|×3Ñ3°CÓ8‰ˆ�Ø�|‰|×'Ñ'¨Ó-Ð-r   Útimeoutc                 ó¬   — | j                   €J ‚|€dnt        |dz  «      }| j                   j                  |«      }|r| j                  «       }|S t        ‚©z-Gets a message if there is one that is ready.Nr0   ©r1   ro   rE   r‚   r   ©r(   rƒ   Ú
timeout_msÚreadyÚress        r   Úget_msgzZMQSocketChannel.get_msgð   sR   € à�{‰{Ð&Ð&Ð&Ø$˜_‘T´#°gÀ±nÓ2Eˆ
Ø—‘× Ñ  Ó,ˆÙØ—*‘*“,ˆCØˆJäˆKr   c                 ój   — g }	 	 |j                  | j                  «       «       Œ!# t        $ r Y |S w xY w)ú*Get all messages that are currently ready.©Úappendr‹   r   ©r(   Úmsgss     r   Úget_msgszZMQSocketChannel.get_msgsû   s?   € àˆØðØ—‘˜DŸL™L›NÔ+ð øô ò ØØˆðús   …% ¥	2±2c                 óh   — | j                   €J ‚t        | j                   j                  d¬«      «      S )ú*Is there a message that has been received?r   ©rƒ   ©r1   rD   rE   rT   s    r   Ú	msg_readyzZMQSocketChannel.msg_ready  s/   € à�{‰{Ð&Ð&Ð&Ü�D—K‘K×$Ñ$¨QÐ$Ó/Ó0Ð0r   c                 ó„   — | j                   �%	 | j                   j                  d¬«       d| _         yy# t        $ r Y Œw xY w)zClose the socket channel.Nr   r`   ra   rT   s    r   r3   zZMQSocketChannel.close
  rc   rd   c                 ó   — | j                   duS )z"Test whether the channel is alive.N)r1   rT   s    r   rY   zZMQSocketChannel.is_alive  s   € à�{‰{ $Ð&Ð&r   r   c                 ól   — | j                   €J ‚| j                  j                  | j                   |«       y)z(Pass a message to the ZMQ socket to sendN)r1   r   rB   )r(   r   s     r   rB   zZMQSocketChannel.send  s*   € à�{‰{Ð&Ð&Ð&Ø�‰×Ñ˜$Ÿ+™+ sÕ+r   c                  ó   — y)zStart the socket channel.Nr   rT   s    r   ÚstartzZMQSocketChannel.start  s   € àr   ©Nrg   )r   r   r   r   r%   ÚSocketr
   rk   ÚAnyr   ÚDictrn   r‚   rh   r‹   ÚListr’   rD   r—   r3   r^   rY   rB   rœ   rs   rt   s   @r   rv   rv   Ö   só   ø„ Ùñ˜sŸz™zð °Gð À1Ç5Á5ð ÐTXõ ð".˜aŸe™eð .¨¯©¨s°A·E±E¨zÑ(:ó .ñ	˜u t™|ð 	°q·v±v¸cÀ1Ç5Á5¸jÑ7Ió 	ð˜!Ÿ&™& §¡¨¨Q¯U©U¨
Ñ!3Ñ4ó ð1˜4ó 1ó
ð €Dð'˜$ó 'ð,˜Ÿ™˜s A§E¡E˜zÑ*ð ,¨tó ,÷
r   rv   c            	       ó¬  ‡ — e Zd ZU dZej
                  j                  ed<   ddej
                  j                  dede	j                  ddfˆ fd„Zde	j                  de	j                  ee	j                  f   fd	„Z	 dd
edz  de	j                  ee	j                  f   fd„Zde	j"                  e	j                  ee	j                  f      fd„Zdefd„Zˆ xZS )ÚAsyncZMQSocketChannelzA ZMQ socket in an async APIr1   Nr   rP   r   c                 óˆ   •— t        |t        j                  j                  «      sd}t	        |«      ‚t
        ‰| �  ||«       y)a  Create a channel.

        Parameters
        ----------
        socket : :class:`zmq.asyncio.Socket`
            The ZMQ socket to use.
        session : :class:`session.Session`
            The session to use.
        loop
            Unused here, for other implementations
        zSocket must be asyncioN)r    r%   rL   rž   Ú
ValueErrorr   r   )r(   r1   r   rP   r   r+   s        €r   r   zAsyncZMQSocketChannel.__init__(  s7   ø€ ô ˜&¤#§+¡+×"4Ñ"4Ô5Ø*ˆCÜ˜S“/Ð!Ü‰Ñ˜ Õ)r   rx   c              ‹   óä   K  — | j                   €J ‚ | j                   j                  di |¤Žƒ d {  –—† }| j                  j                  |«      \  }}| j                  j	                  |«      S 7 Œ=­wrz   r{   )r(   rx   r   Ú_r�   s        r   r‚   zAsyncZMQSocketChannel._recv9  sd   è ø€ Ø�{‰{Ð&Ð&Ð&Ø.�D—K‘K×.Ñ.Ñ8°Ñ8×8ˆØ—,‘,×.Ñ.¨sÓ3‰ˆˆ4Ø�|‰|×'Ñ'¨Ó-Ð-ð 9ús   ‚.A0°A.±>A0rƒ   c              ƒ   óÜ   K  — | j                   €J ‚|€dnt        |dz  «      }| j                   j                  |«      ƒ d{  –—† }|r| j                  «       ƒ d{  –—† }|S t        ‚7 Œ&7 Œ­wr…   r†   r‡   s        r   r‹   zAsyncZMQSocketChannel.get_msg?  sg   è ø€ ð �{‰{Ð&Ð&Ð&Ø$˜_‘T´#°gÀ±nÓ2Eˆ
Ø—k‘k×&Ñ& zÓ2×2ˆÙØŸ
™
›×$ˆCØˆJäˆKð 3øà$ús#   ‚?A,ÁA(ÁA,ÁA*ÁA,Á*A,c              ƒ   ó†   K  — g }	 	 |j                  | j                  «       ƒ d{  –—† «       Œ)7 Œ	# t        $ r Y |S w xY w­w)r�   NrŽ   r�   s     r   r’   zAsyncZMQSocketChannel.get_msgsL  sF   è ø€ àˆØðØ—‘ $§,¡,£.×0Ô1ð à0ùÜò ØØˆðüs,   ‚A‡1 ¥/¦1 ®A¯1 ±	>ºA½>¾Ac              ƒ   ó„   K  — | j                   €J ‚t        | j                   j                  d¬«      ƒ d{  –—† «      S 7 Œ­w)r”   Nr   r•   r–   rT   s    r   r—   zAsyncZMQSocketChannel.msg_readyV  s9   è ø€ à�{‰{Ð&Ð&Ð&Ü˜$Ÿ+™+×*Ñ*°1Ð*Ó5×5Ó6Ð6Ð5ús   ‚3A µ>¶	A r�   )r   r   r   r   r%   rL   rž   ri   r
   rk   rŸ   r   r    rn   r‚   rh   r‹   r¡   r’   rD   r—   rs   rt   s   @r   r£   r£   #  sÏ   ø… Ù&à�K‰K×ÑÓñ*˜sŸ{™{×1Ñ1ð *¸Gð *È1Ï5É5ð *Ð\`õ *ð". A§E¡Eð .¨a¯f©f°S¸!¿%¹%°ZÑ.@ó .ð '+ñØ˜t‘|ðà	
�‰��Q—U‘U�
Ñ	óð §¡ q§v¡v¨c°1·5±5¨jÑ'9Ñ :ó ð7 ÷ 7r   r£   )r   rL   rr   rC   Útypingrk   Úqueuer   Ú	threadingr   r   Úzmq.asyncior%   Újupyter_core.utilsr   Ú_versionr   Úchannelsabcr	   r   r
   Úmajor_protocol_versionrb   r   r   r:   rv   r£   r   r   r   Ú<module>r³      s   ðÙ Ió Û Û Û Ý ß #ã Ý +å +Ý %Ý ð /¨qÑ1Ð ô	˜	ô 	ôm�ô mð` €× Ñ �iÔ  ÷Jñ JôZ67Ð,õ 67r   