Ë
    :vžj¸  ã                  ó¶   — d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	Z
ddl
mZ ddlmZ erddlmZmZ dd„Z G d	„ d
e
j$                  j&                  «      Zy)z9Tornado websocket handler to serve a terminal interface.
é    )ÚannotationsN)ÚTYPE_CHECKINGÚAny)Úgen)Úrun_on_executor)ÚPtyWithClientsÚTermManagerBasec                óH   — t        | t        «      r| j                  d«      S | S )Nzutf-8)Ú
isinstanceÚbytesÚdecode)Úss    úd/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/terminado/websocket.pyÚ_cast_unicoder      s    € Ü�!”UÔØ�x‰x˜Ó Ð Ø€Hó    c                  ó¨   ‡ — e Zd ZdZdd„Zddd„Zddˆ fd„Zdd„Zdd„Ze	j                  dd„«       Zdd„Zdd	„Zddd
„Z ed¬«      dd„«       Zˆ xZS )Ú
TermSocketz Handler for a terminal websocketc                ó
  — || _         d| _        d| _        d| _        |j                  | _        t        j                  t        «      | _	        d| _
        t        j                  t        j                  dd«      «      dk(  | _        y)zInitialize the handler.Ú )NNNÚLOG_TERMINAL_OUTPUTÚfalseÚtrue)Úterm_managerÚ	term_nameÚsizeÚterminalÚblocking_io_executorÚ_blocking_io_executorÚloggingÚ	getLoggerÚ__name__Ú_loggerÚ_user_commandÚstrÚlowerÚosÚgetenvÚ_enable_output_logging)Úselfr   s     r   Ú
initializezTermSocket.initialize   sm   € à(ˆÔØˆŒØ ˆŒ	Ø/3ˆŒØ%1×%FÑ%FˆÔ"ä×(Ñ(¬Ó2ˆŒØˆÔô '*§i¡i´·	±	Ð:OÐQXÓ0YÓ&ZÐ^dÑ&dˆÕ#r   c                ó€   — |xs& | j                   j                  j                  dd«      }|€J ‚| j                  |«      S )z1Deprecated: backward-compat for terminado <= 0.5.ÚOriginr   )ÚrequestÚheadersÚgetÚcheck_origin)r)   Úorigins     r   Úorigin_checkzTermSocket.origin_check,   s@   € àÒA˜4Ÿ<™<×/Ñ/×3Ñ3°H¸bÓAˆØÐ!Ð!Ð!Ø× Ñ  Ó(Ð(r   c                ó,  •— t         ‰| �  |«       | j                  j                  d|«       t	        |«      }|xs d| _        | j                  j                  |«      | _        | j                  j                  j                  | «       | j                  di g«       | j                  j                  d| j
                  «       d}| j                  j                  j                  «       }	 |sn|j                  «       }||z  }Œ|r| j                  |«       yy)z‚Websocket connection opened.

        Call our terminal manager to get a terminal, and connect to it as a
        client.
        zTermSocket.open: %sÚttyÚsetupzTermSocket.open: Opened %sr   N)ÚsuperÚopenr"   Úinfor   r   r   Úget_terminalr   ÚclientsÚappendÚsend_json_messageÚread_bufferÚcopyÚpopleftÚon_pty_read)r)   Úurl_componentÚbufferedÚpreopen_bufferr   Ú	__class__s        €r   r7   zTermSocket.open2   sñ   ø€ ô 	‰‰�]Ô#à�‰×ÑÐ/°Ô?ä% mÓ4ˆØ&Ò/¨%ˆŒØ×)Ñ)×6Ñ6°}ÓEˆŒØ�‰×Ñ×$Ñ$ TÔ*Ø×Ñ ¨˜}Ô-Ø�‰×ÑÐ6¸¿¹ÔGàˆØŸ™×2Ñ2×7Ñ7Ó9ˆØÙ!ØØ×&Ñ&Ó(ˆAØ˜‰MˆHð	 ñ
 Ø×Ñ˜XÕ&ð r   c                ó*   — | j                  d|g«       y)z$Data read from pty; send to frontendÚstdoutN)r<   ©r)   Útexts     r   r@   zTermSocket.on_pty_readO   s   € à×Ñ ¨$Ð/Õ0r   c                óÒ   — t        j                  |«      }| j                  |«       | j                  r5|d   dk(  r,t	        |d   t
        «      r| j                  d|d   › �«       yyyy)z"Send a json message on the socket.r   rF   é   zSTDOUT: N)ÚjsonÚdumpsÚwrite_messager(   r   r$   Úlog_terminal_output)r)   ÚcontentÚjson_msgs      r   r<   zTermSocket.send_json_messageS   si   € ä—:‘:˜gÓ&ˆØ×Ñ˜8Ô$à×&Ò&¨7°1©:¸Ò+AÄjÐQXÐYZÑQ[Ô]`ÔFaØ×$Ñ$ x°¸±
¨|Ð%<Õ=ð GbÐ+AÐ&r   c              #  óŽ  K  — t        j                  |«      }|d   }| j                  €J ‚|dk(  rj| j                  |d   «      –— | j                  rG|d   dk(  r&| j                  d| j                  › �«       d| _        y| xj                  |d   z  c_        yy|dk(  r%|dd	 | _        | j                  j                  «        yy­w)
zÇHandle incoming websocket message

        We send JSON arrays, where the first element is a string indicating
        what kind of message this is. Data associated with the message follows.
        r   NÚstdinrJ   ÚzSTDIN: r   Úset_sizeé   )	rK   Úloadsr   Ústdin_to_ptyprocr(   rN   r#   r   Úresize_to_smallest)r)   ÚmessageÚcommandÚmsg_types       r   Ú
on_messagezTermSocket.on_message[   sË   è ø€ ô —*‘*˜WÓ%ˆØ˜1‘:ˆØ�}‰}Ð(Ð(Ð(Ø�wÒØ×'Ñ'¨°©
Ó3Ò3Ø×*Ò*Ø˜1‘: Ò%Ø×,Ñ,¨w°t×7IÑ7IÐ6JÐ-KÔLØ)+�DÕ&à×&Ò&¨'°!©*Ñ4Ö&ð +ð ˜Ò#Ø  !˜ˆDŒIØ�M‰M×,Ñ,Õ.ð $ùs   ‚CCc                ó  — | j                   j                  d«       | j                  r?| j                  j                  j	                  | «       | j                  j                  «        | j                  j                  | «       y)z„Handle websocket closing.

        Disconnect from our terminal, and tell the terminal manager we're
        disconnecting.
        zWebsocket closedN)r"   r8   r   r:   ÚremoverX   r   Úclient_disconnected©r)   s    r   Úon_closezTermSocket.on_closer   sZ   € ð 	�‰×ÑÐ,Ô-Ø�=Š=Ø�M‰M×!Ñ!×(Ñ(¨Ô.Ø�M‰M×,Ñ,Ô.Ø×Ñ×-Ñ-¨dÕ3r   c                óX   — | j                  ddg«       | j                  «        d| _        y)z9Terminal closed: tell the frontend, and close the socket.Ú
disconnectrJ   N)r<   Úcloser   r`   s    r   Úon_pty_diedzTermSocket.on_pty_died~   s%   € à×Ñ ¨aÐ0Ô1Ø�
‰
ŒØˆ�r   c                ó:   — | j                   j                  |«       y)zg
        Logs the terminal input/output
        :param log: log line to write
        :return:
        N)r"   Údebug)r)   Úlogs     r   rN   zTermSocket.log_terminal_output„   s   € ð 	�‰×Ñ˜3Õr   r   )Úexecutorc                óh   — | j                   �&| j                   j                  j                  |«       yy)a   Handles stdin messages sent on the websocket.

        This is a blocking call that should NOT be performed inside the
        server primary event loop thread. Messages must be handled
        asynchronously to prevent blocking on the PTY buffer.
        N)r   ÚptyprocÚwriterG   s     r   rW   zTermSocket.stdin_to_ptyprocŒ   s+   € ð �=‰=Ð$Ø�M‰M×!Ñ!×'Ñ'¨Õ-ð %r   )r   r	   ÚreturnÚNone)N)r1   z
str | Nonerm   Úbool)rA   r   rm   rn   )rH   r$   rm   rn   )rO   r   rm   rn   )rY   r$   rm   rn   )rm   rn   )r   )rh   r$   rm   rn   )r!   Ú
__module__Ú__qualname__Ú__doc__r*   r2   r7   r@   r<   r   Ú	coroutiner\   ra   re   rN   r   rW   Ú__classcell__)rD   s   @r   r   r      sa   ø„ Ù*óeô)ö'ó:1ó>ð 	‡]�]ò/ó ð/ó,
4óô ñ Ð5Ô6ò.ó 7ô.r   r   )r   zstr | bytesrm   r$   )rr   Ú
__future__r   rK   r   r&   Útypingr   r   Útornado.websocketÚtornador   Útornado.concurrentr   Úterminado.managementr   r	   r   Ú	websocketÚWebSocketHandlerr   © r   r   Ú<module>r~      sI   ðñõ
 #ã Û Û 	ß %ã Ý Ý .áßDóôz.�×"Ñ"×3Ñ3õ z.r   