o
    �õ±j  ã                   @  sÀ   d Z ddlmZ ddlZddlZddlmZ ddlmZmZ ddl	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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.
é    )ÚannotationsN)Úget_running_loop)ÚCallableÚ	Coroutine)ÚAnyÚTextIOÚcast)Ú
AppSessionÚcreate_app_session)ÚSize)Ú	PipeInputÚcreate_pipe_input)ÚVt100_OutputÚPromptToolkitSSHSessionÚPromptToolkitSSHServerc                   @  s\   e Zd Zd$dd„Zd%d
d„Zd&dd„Zd'dd„Zd(dd„Zd(dd„Zd)dd„Z	d*d!d"„Z
d#S )+r   Úinteractú>Callable[[PromptToolkitSSHSession], Coroutine[Any, Any, None]]Ú
enable_cprÚboolÚreturnÚNonec                  sN   |ˆ _ |ˆ _d ˆ _d ˆ _d ˆ _d ˆ _d ˆ _G ‡ fdd„dƒ}tt|ƒ ƒˆ _	d S )Nc                      s@   e Zd Zd‡ fdd„Zddd	„Zdd
d„Zed‡ fdd„ƒZdS )z0PromptToolkitSSHSession.__init__.<locals>.StdoutÚdataÚstrr   r   c                   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© ú”/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/prompt_toolkit/contrib/ssh/server.pyr   -   s   
ÿÿz6PromptToolkitSSHSession.__init__.<locals>.Stdout.writer   c                 S  ó   dS ©NTr!   ©r   r!   r!   r"   Úisatty4   ó   z7PromptToolkitSSHSession.__init__.<locals>.Stdout.isattyc                 S  s   d S ©Nr!   r%   r!   r!   r"   Úflush7   r'   z6PromptToolkitSSHSession.__init__.<locals>.Stdout.flushc                   s"   ˆ j d usJ ‚tˆ j j ¡ d ƒS )Nr   )r   r   Ú
_orig_chanÚget_encodingr%   r   r!   r"   Úencoding:   s   z9PromptToolkitSSHSession.__init__.<locals>.Stdout.encodingN)r   r   r   r   ©r   r   ©r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__r   r&   r)   Úpropertyr,   r!   r   r!   r"   ÚStdout,   s    

r3   )
r   r   Úinteract_taskr   Úapp_sessionÚ_inputÚ_outputr   r   Ústdout)r    r   r   r3   r!   r   r"   Ú__init__   s   z PromptToolkitSSHSession.__init__r   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_sizeA   s   
z!PromptToolkitSSHSession._get_sizeÚchanr   c                 C  s
   || _ d S r(   )r   )r    rE   r!   r!   r"   Úconnection_madeK   s   
z'PromptToolkitSSHSession.connection_madec                 C  r#   r$   r!   r   r!   r!   r"   Úshell_requestedN   r'   z'PromptToolkitSSHSession.shell_requestedc                 C  s   t ƒ  |  ¡ ¡| _d S r(   )r   Úcreate_taskÚ	_interactr4   r   r!   r!   r"   Úsession_startedQ   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|| j	d�| _
tƒ �]| _t| j| j
d��;}|| _z$z
|  | ¡I d H  W n tyV   t ¡  Y nw W | j  ¡  | j ¡  n| j  ¡  | j ¡  w W d   ƒ n1 sxw   Y  W d   ƒ d S W d   ƒ d S 1 s�w   Y  d S )Nz,`_interact` called before `connection_made`.Úset_line_modeF)Útermr   )ÚinputÚoutput)r   Ú	ExceptionÚhasattrÚ_editorrK   Úget_terminal_typer   r8   rD   r   r7   r   r6   r
   r5   r   ÚBaseExceptionÚ	tracebackÚ	print_excÚclose)r    rL   Úsessionr!   r!   r"   rI   T   s4   €

ÿ
ÿ€

ÿ÷ÿ"ÿz!PromptToolkitSSHSession._interactr@   ÚintrA   rB   ÚobjectrC   c                 C  s&   | j r| j jr| j j ¡  d S d S d S r(   )r5   ÚappÚ
_on_resizer?   r!   r!   r"   Úterminal_size_changedp   s   ÿz-PromptToolkitSSHSession.terminal_size_changedr   r   Údatatypec                 C  s   | j d u rd S | j  |¡ d S r(   )r6   Ú	send_text)r    r   r]   r!   r!   r"   Údata_receivedw   s   
z%PromptToolkitSSHSession.data_receivedN©r   r   r   r   r   r   )r   r   )rE   r   r   r   r-   r.   )
r@   rX   rA   rX   rB   rY   rC   rY   r   r   )r   r   r]   rY   r   r   )r/   r0   r1   r9   rD   rF   rG   rJ   rI   r\   r_   r!   r!   r!   r"   r      s    

)





c                   @  s4   e Zd ZdZddœdd
d„Zddd„Zddd„ZdS )r   aZ  
    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_running_loop()
        loop.run_until_complete(
            asyncssh.create_server(
                lambda: MySSHServer(interact),
                "",
                port,
                server_host_keys=["/etc/ssh/..."],
            )
        )
        loop.run_forever()

    :param enable_cpr: When `True`, the default, try to detect whether the SSH
        client runs in a terminal that responds to "cursor position requests".
        That way, we can properly determine how much space there is available
        for the UI (especially for drop down menus) to render.
    T©r   r   r   r   r   r   r   c                C  s   || _ || _d S r(   )r   r   )r    r   r   r!   r!   r"   r9   ¥   s   
zPromptToolkitSSHServer.__init__Úusernamer   c                 C  r#   )NFr!   )r    rb   r!   r!   r"   Ú
begin_auth®   s   z!PromptToolkitSSHServer.begin_authr   c                 C  s   t | j| jd�S )Nra   )r   r   r   r   r!   r!   r"   Úsession_requested²   s   z(PromptToolkitSSHServer.session_requestedNr`   )rb   r   r   r   )r   r   )r/   r0   r1   Ú__doc__r9   rc   rd   r!   r!   r!   r"   r      s    )ü
	)re   Ú
__future__r   ÚasynciorT   r   Úcollections.abcr   r   Útypingr   r   r   ÚasyncsshÚ"prompt_toolkit.application.currentr	   r
   Úprompt_toolkit.data_structuresr   Úprompt_toolkit.inputr   r   Úprompt_toolkit.output.vt100r   Ú__all__ÚSSHServerSessionr   Ú	SSHServerr   r!   r!   r!   r"   Ú<module>   s    h