o
    ˷e                     @   s   d Z ddlZddlZddlmZmZmZmZmZm	Z	 ddl
Z
ddlmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZ d	d
gZG dd	 d	e
jZG dd
 d
e
jZdS )zI
Utility for running a prompt_toolkit application in an asyncssh server.
    N)Any	AwaitableCallableOptionalTextIOcast)
AppSessioncreate_app_session)Size)get_event_loop)	PipeInputcreate_pipe_input)Vt100_OutputPromptToolkitSSHSessionPromptToolkitSSHServerc                
   @   s   e Zd Zded ged f ddfddZdefddZdeddfd	d
Z	de
fddZdddZdddZdededededdf
ddZdededdfddZdS )r   interactNreturnc                    sH   | _ d  _d  _d  _d  _d  _G  fddd}tt|  _d S )Nc                       sP   e Zd Zdeddf fddZdefddZddd	Zedef fd
dZ	dS )z0PromptToolkitSSHSession.__init__.<locals>.Stdoutdatar   Nc                    s@   z j d ur j |dd W d S W d S  ty   Y d S w )N
z
)_chanwritereplaceBrokenPipeError)sr   self X/var/www/ideatree/venv/lib/python3.10/site-packages/prompt_toolkit/contrib/ssh/server.pyr   %   s   
z6PromptToolkitSSHSession.__init__.<locals>.Stdout.writec                 S      dS NTr   r   r   r   r   isatty,      z7PromptToolkitSSHSession.__init__.<locals>.Stdout.isattyc                 S   s   d S Nr   r    r   r   r   flush/   r"   z6PromptToolkitSSHSession.__init__.<locals>.Stdout.flushc                    s"    j d usJ t j j d S )Nr   )r   str
_orig_changet_encodingr    r   r   r   encoding2   s   z9PromptToolkitSSHSession.__init__.<locals>.Stdout.encodingr   N)
__name__
__module____qualname__r%   r   boolr!   r$   propertyr(   r   r   r   r   Stdout$   s    
r/   )	r   interact_taskr   app_session_input_outputr   r   stdout)r   r   r/   r   r   r   __init__   s   z PromptToolkitSSHSession.__init__c                 C   s4   | j du rtdddS | j  \}}}}t||dS )zU
        Callable that returns the current `Size`, required by Vt100_Output.
        N   O   )rowscolumns)r   r
   get_terminal_sizer   widthheightpixwidth	pixheightr   r   r   	_get_size9   s   
z!PromptToolkitSSHSession._get_sizechanc                 C   
   || _ d S r#   )r   )r   rA   r   r   r   connection_madeC      
z'PromptToolkitSSHSession.connection_madec                 C   r   r   r   r   r   r   r   shell_requestedF   r"   z'PromptToolkitSSHSession.shell_requestedc                 C   s   t  |  | _d S r#   )r   create_task	_interactr0   r   r   r   r   session_startedI   s   z'PromptToolkitSSHSession.session_startedc              
      s*  | j d u r
tdt| j dr| j jd ur| j d | j  }t| j| j|d| _	t
 ]| _t| j| j	d;}|| _z$z
| | I d H  W n tyT   t  Y nw W | j   | j  n| j   | j  w W d    n1 svw   Y  W d    d S W d    d S 1 sw   Y  d S )Nz,`_interact` called before `connection_made`.set_line_modeF)term)inputoutput)r   	Exceptionhasattr_editorrI   get_terminal_typer   r4   r@   r3   r   r2   r	   r1   r   BaseException	traceback	print_excclose)r   rJ   sessionr   r   r   rG   L   s0   




"z!PromptToolkitSSHSession._interactr<   r=   r>   r?   c                 C   s&   | j r| j jr| j j  d S d S d S r#   )r1   app
_on_resizer;   r   r   r   terminal_size_changedf   s   z-PromptToolkitSSHSession.terminal_size_changedr   datatypec                 C   s   | j d u rd S | j | d S r#   )r2   	send_text)r   r   rY   r   r   r   data_receivedm   s   
z%PromptToolkitSSHSession.data_receivedr)   )r*   r+   r,   r   r   r5   r
   r@   r   rC   r-   rE   rH   rG   intobjectrX   r%   r[   r   r   r   r   r      s.    
%



c                   @   sP   e Zd ZdZdeeged f ddfddZdede	fdd	Z
defd
dZdS )r   a,  
    Run a prompt_toolkit application over an asyncssh server.

    This takes one argument, an `interact` function, which is called for each
    connection. This should be an asynchronous function that runs the
    prompt_toolkit applications. This function runs in an `AppSession`, which
    means that we can have multiple UI interactions concurrently.

    Example usage:

    .. code:: python

        async def interact(ssh_session: PromptToolkitSSHSession) -> None:
            await yes_no_dialog("my title", "my text").run_async()

            prompt_session = PromptSession()
            text = await prompt_session.prompt_async("Type something: ")
            print_formatted_text('You said: ', text)

        server = PromptToolkitSSHServer(interact=interact)
        loop = get_event_loop()
        loop.run_until_complete(
            asyncssh.create_server(
                lambda: MySSHServer(interact),
                "",
                port,
                server_host_keys=["/etc/ssh/..."],
            )
        )
        loop.run_forever()
    r   Nr   c                 C   rB   r#   )r   )r   r   r   r   r   r5      s   
zPromptToolkitSSHServer.__init__usernamec                 C   r   )NFr   )r   r^   r   r   r   
begin_auth   s   z!PromptToolkitSSHServer.begin_authc                 C   s
   t | jS r#   )r   r   r   r   r   r   session_requested   rD   z(PromptToolkitSSHServer.session_requested)r*   r+   r,   __doc__r   r   r   r5   r%   r-   r_   r`   r   r   r   r   r   u   s     
)ra   asynciorR   typingr   r   r   r   r   r   asyncssh"prompt_toolkit.application.currentr   r	   prompt_toolkit.data_structuresr
   prompt_toolkit.eventloopr   prompt_toolkit.inputr   r   prompt_toolkit.output.vt100r   __all__SSHServerSessionr   	SSHServerr   r   r   r   r   <module>   s     b