
    Mh                        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dS )z9Tornado websocket handler to serve a terminal interface.
    )annotationsN)TYPE_CHECKINGAny)gen)run_on_executor)PtyWithClientsTermManagerBasesstr | bytesreturnstrc                Z    t          | t                    r|                     d          S | S )Nzutf-8)
isinstancebytesdecode)r
   s    S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/terminado/websocket.py_cast_unicoder      s+    !U !xx   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 websocketterm_managerr	   r   Nonec                   || _         d| _        d| _        d| _        |j        | _        t          j        t                    | _	        d| _
        t                              t          j        dd                    dk    | _        dS )zInitialize the handler. )NNNLOG_TERMINAL_OUTPUTfalsetrue)r   	term_namesizeterminalblocking_io_executor_blocking_io_executorlogging	getLogger__name___logger_user_commandr   lowerosgetenv_enable_output_logging)selfr   s     r   
initializezTermSocket.initialize   st    ( 	/3%1%F"(22 '*ii	:OQX0Y0Y&Z&Z^d&d###r   Norigin
str | Noneboolc                x    |p| j         j                            dd          }|J |                     |          S )z1Deprecated: backward-compat for terminado <= 0.5.Originr   )requestheadersgetcheck_origin)r,   r.   s     r   origin_checkzTermSocket.origin_check,   sA    A4</33HbAA!!!  (((r   url_componentr   c                H   t                                          |           | j                            d|           t	          |          }|pd| _        | j                            |          | _        | j        j	        
                    |            |                     di g           | j                            d| j                   d}| j        j                                        }	 |sn|                                }||z  }|r|                     |           dS dS )zWebsocket 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   TN)superopenr&   infor   r   r   get_terminalr    clientsappendsend_json_messageread_buffercopypoplefton_pty_read)r,   r8   bufferedpreopen_bufferr
   	__class__s        r   r=   zTermSocket.open2   s)    	]###/???%m44&/%)66}EE$$T***}---6GGG27799	! &&((AMH		
  	'X&&&&&	' 	'r   textr   c                4    |                      d|g           dS )z$Data read from pty; send to frontendstdoutN)rB   r,   rJ   s     r   rF   zTermSocket.on_pty_readO   s!    $/00000r   contentc                    t          j        |          }|                     |           | j        rG|d         dk    r=t	          |d         t
                    r$|                     d|d                     dS dS dS dS )z"Send a json message on the socket.r   rL      zSTDOUT: N)jsondumpswrite_messager+   r   r   log_terminal_output)r,   rN   json_msgs      r   rB   zTermSocket.send_json_messageS   s    :g&&8$$$& 	>71:+A+AjQXYZQ[]`FaFa+A$$%<
%<%<=====	> 	>+A+A+A+Ar   messagec              #    K   t          j        |          }|d         }| j        J |dk    rp|                     |d                   V  | j        rJ|d         dk    r&|                     d| j                    d| _        dS | xj        |d         z  c_        dS dS |dk    r*|dd	         | _        | j                                         dS dS )
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stdinrP   zSTDIN: r   set_size   )	rQ   loadsr    stdin_to_ptyprocr+   rT   r'   r   resize_to_smallest)r,   rV   commandmsg_types       r   
on_messagezTermSocket.on_message[   s      *W%%1:}(((w''
33333* 51:%%,,-Kt7I-K-KLLL)+D&&&&&'!*4&&&&5 5 ##!DIM,,..... $#r   c                    | j                             d           | j        r8| j        j                            |            | j                                         | j                            |            dS )zHandle 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_closezTermSocket.on_closer   so     	,---= 	/M!((...M,,...--d33333r   c                j    |                      ddg           |                                  d| _        dS )z9Terminal closed: tell the frontend, and close the socket.
disconnectrP   N)rB   closer    re   s    r   on_pty_diedzTermSocket.on_pty_died~   s3    a0111

r   r   logc                :    | j                             |           dS )zg
        Logs the terminal input/output
        :param log: log line to write
        :return:
        N)r&   debug)r,   rk   s     r   rT   zTermSocket.log_terminal_output   s      	3r   r"   )executorc                V    | j         !| j         j                            |           dS dS )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writerM   s     r   r]   zTermSocket.stdin_to_ptyproc   s3     =$M!''----- %$r   )r   r	   r   r   )N)r.   r/   r   r0   )r8   r   r   r   )rJ   r   r   r   )rN   r   r   r   )rV   r   r   r   )r   r   )r   )rk   r   r   r   )r%   
__module____qualname____doc__r-   r7   r=   rF   rB   r   	coroutinera   rf   rj   rT   r   r]   __classcell__)rI   s   @r   r   r      s3       **e e e e) ) ) ) )' ' ' ' ' ' ':1 1 1 1> > > > 	]/ / / ]/,
4 
4 
4 
4             _5666. . . 76. . . . .r   r   )r
   r   r   r   )rt   
__future__r   rQ   r#   r)   typingr   r   tornado.websockettornador   tornado.concurrentr   terminado.managementr   r	   r   	websocketWebSocketHandlerr    r   r   <module>r      s    
 # " " " " "   				 % % % % % % % %           . . . . . . EDDDDDDDD   z. z. z. z. z."3 z. z. z. z. z.r   