
    h                        S r SSKJr  SSKrSSKrSSKrSSKJrJr  SSK	r
SSK
Jr  SSKJr  \(       a  SSKJrJr  SS jr " S	 S
\
R$                  R&                  5      rg)z9Tornado websocket handler to serve a terminal interface.
    )annotationsN)TYPE_CHECKINGAny)gen)run_on_executor)PtyWithClientsTermManagerBasec                R    [        U [        5      (       a  U R                  S5      $ U $ )Nzutf-8)
isinstancebytesdecode)ss    fC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\terminado/websocket.py_cast_unicoder      s#    !Uxx  H    c                     ^  \ rS rSrSrSS jrSSS jjrSSU 4S jjjrSS jrSS jr	\
R                  SS j5       rSS	 jrSS
 jrSSS jjr\" SS9SS j5       rSrU =r$ )
TermSocket   z Handler for a terminal websocketc                   Xl         SU l        SU l        SU l        UR                  U l        [        R                  " [        5      U l	        SU l
        [        R                  [        R                  " SS5      5      S:H  U l        g)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   
initializeTermSocket.initialize   sk    ( 	/3%1%F%F"((2 '*ii		:OQX0Y&Z^d&d#r   c                    U=(       d&    U R                   R                  R                  SS5      nUc   eU R                  U5      $ )z1Deprecated: backward-compat for terminado <= 0.5.Originr   )requestheadersgetcheck_origin)r*   origins     r   origin_checkTermSocket.origin_check,   s@    A4<<//33HbA!!!  ((r   c                J  > [         TU ]  U5        U R                  R                  SU5        [	        U5      nU=(       d    SU l        U R                  R                  U5      U l        U R                  R                  R                  U 5        U R                  S0 /5        U R                  R                  SU R
                  5        SnU R                  R                  R                  5       n U(       d  OUR                  5       nX$-  nM  U(       a  U R                  U5        gg)zjWebsocket 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   r:   TermSocket.open2   s     	]#/?%m4&/%))66}E$$T*}-6G22779!&&(AMH	 
 X& r   c                *    U R                  SU/5        g)z$Data read from pty; send to frontendstdoutN)r?   r*   texts     r   rC   TermSocket.on_pty_readO   s    $/0r   c                    [         R                  " U5      nU R                  U5        U R                  (       a;  US   S:X  a1  [	        US   [
        5      (       a  U R                  SUS    35        gggg)z"Send a json message on the socket.r   rJ      zSTDOUT: N)jsondumpswrite_messager)   r   r%   log_terminal_output)r*   contentjson_msgs      r   r?   TermSocket.send_json_messageS   sl    ::g&8$&&71:+AjQXYZQ[]`FaFa$$x
|%<= Gb+A&r   c              #    #    [         R                  " U5      nUS   nU R                  c   eUS:X  ap  U R                  US   5      v   U R                  (       aH  US   S:X  a&  U R                  SU R                   35        SU l        gU =R                  US   -  sl        ggUS:X  a%  USS	 U l        U R                  R                  5         gg7f)
zHandle 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stdinrO   zSTDIN: r   set_size   )	rP   loadsr   stdin_to_ptyprocr)   rS   r$   r   resize_to_smallest)r*   messagecommandmsg_types       r   
on_messageTermSocket.on_message[   s      **W%1:}}(((w''
33**1:%,,wt7I7I6J-KL)+D&&&'!*4& + #!DIMM,,. $s   CCc                   U R                   R                  S5        U R                  (       a?  U R                  R                  R	                  U 5        U R                  R                  5         U R                  R                  U 5        g)zlHandle websocket closing.

Disconnect from our terminal, and tell the terminal manager we're
disconnecting.
zWebsocket closedN)r#   r;   r   r=   remover^   r   client_disconnectedr*   s    r   on_closeTermSocket.on_closer   sZ     	,-==MM!!((.MM,,.--d3r   c                X    U R                  SS/5        U R                  5         SU l        g)z9Terminal closed: tell the frontend, and close the socket.
disconnectrO   N)r?   closer   rg   s    r   on_pty_diedTermSocket.on_pty_died~   s%    a01

r   c                :    U R                   R                  U5        g)zG
Logs the terminal input/output
:param log: log line to write
:return:
N)r#   debug)r*   logs     r   rS   TermSocket.log_terminal_output   s     	3r   r   )executorc                j    U R                   b&  U R                   R                  R                  U5        gg)zHandles 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writerK   s     r   r]   TermSocket.stdin_to_ptyproc   s+     ==$MM!!''- %r   )r   r)   r#   r$   r   r   r   r   )r   r	   returnNone)N)r3   z
str | Nonerx   bool)rD   r   rx   ry   )rL   r%   rx   ry   )rT   r   rx   ry   )r_   r%   rx   ry   )rx   ry   )r   )rq   r%   rx   ry   )r"   
__module____qualname____firstlineno____doc__r+   r4   r:   rC   r?   r   	coroutinerb   rh   rm   rS   r   r]   __static_attributes____classcell__)rG   s   @r   r   r      sf    *e)' ':1> 	]]/ /,
4  56. 7.r   r   )r   zstr | bytesrx   r%   )r~   
__future__r   rP   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   