
    ^h                        S r SSKJr  SSKrSSKrSSKJr  SSKJrJrJ	r	J
r
Jr  SSKrSSKJrJr  SSKJr  SSKJrJr  SS	KJr  S
S/r " S S
\R0                  5      r " S S\R4                  5      rg)zI
Utility for running a prompt_toolkit application in an asyncssh server.
    )annotationsN)get_running_loop)AnyCallable	CoroutineTextIOcast)
AppSessioncreate_app_session)Size)	PipeInputcreate_pipe_input)Vt100_OutputPromptToolkitSSHSessionPromptToolkitSSHServerc                      \ rS rSr      SS jrSS jrSS jrSS jrSS jrSS jr	          SS jr
SS	 jrS
rg)r      c                  ^  UT l         UT l        S T l        S T l        S T l        S T l        S T l         " U 4S jS5      n[        [        U" 5       5      T l	        g )Nc                  T   > \ rS rSrSU 4S jjrS	S jrS
S jr\SU 4S jj5       rSr	g)0PromptToolkitSSHSession.__init__.<locals>.Stdout+   c                   >  TR                   b,  TR                   R                  UR                  SS5      5        g g ! [         a     g f = f)N
z
)_chanwritereplaceBrokenPipeError)sdataselfs     [/home/james-whalen/.local/lib/python3.13/site-packages/prompt_toolkit/contrib/ssh/server.pyr   6PromptToolkitSSHSession.__init__.<locals>.Stdout.write,   sF    zz-

((dF)CD .& s   8= 
A
	A
c                    gNT r   s    r!   isatty7PromptToolkitSSHSession.__init__.<locals>.Stdout.isatty3   s        c                    g Nr%   r&   s    r!   flush6PromptToolkitSSHSession.__init__.<locals>.Stdout.flush6   s    r)   c                   > TR                   c   e[        TR                   R                  R                  5       S   5      $ )Nr   )r   str
_orig_changet_encoding)r   r    s    r!   encoding9PromptToolkitSSHSession.__init__.<locals>.Stdout.encoding9   s6    zz---4::00==?BCCr)   r%   N)r   r/   returnNoner4   boolr4   r5   )r4   r/   )
__name__
__module____qualname____firstlineno__r   r'   r,   propertyr2   __static_attributes__r    s   r!   Stdoutr   +   s(     D Dr)   r@   )
interact
enable_cprinteract_taskr   app_session_input_outputr	   r   stdout)r    rA   rB   r@   s   `   r!   __init__ PromptToolkitSSHSession.__init__   sX     !$8<!%
.2
 )-,0	D 	D& 668,r)   c                |    U R                   c
  [        SSS9$ U R                   R                  5       u  pp4[        X!S9$ )zE
Callable that returns the current `Size`, required by Vt100_Output.
   O   )rowscolumns)r   r   get_terminal_sizer    widthheightpixwidth	pixheights        r!   	_get_size!PromptToolkitSSHSession._get_size@   s=     ::R,,151M1M1O.E8V33r)   c                    Xl         g r+   )r   )r    chans     r!   connection_made'PromptToolkitSSHSession.connection_madeJ   s    
r)   c                    gr$   r%   r?   s    r!   shell_requested'PromptToolkitSSHSession.shell_requestedM   s    r)   c                \    [        5       R                  U R                  5       5      U l        g r+   )r   create_task	_interactrC   r?   s    r!   session_started'PromptToolkitSSHSession.session_startedP   s    -/;;DNN<LMr)   c                  #    U R                   c  [        S5      e[        U R                   S5      (       a2  U R                   R                  b  U R                   R	                  S5        U R                   R                  5       n[        U R                  U R                  XR                  S9U l
        [        5        U l        [        U R                  U R                  S9 nX l         U R                  U 5      I S h  vN   U R                   R'                  5         U R                  R'                  5          S S S 5        S S S 5        g  NJ! [          a    ["        R$                  " 5          Nif = f! U R                   R'                  5         U R                  R'                  5         f = f! , (       d  f       Nw= f! , (       d  f       g = f7f)Nz,`_interact` called before `connection_made`.set_line_modeF)termrB   )inputoutput)r   	Exceptionhasattr_editorrd   get_terminal_typer   rG   rU   rB   rF   r   rE   r   rD   rA   BaseException	traceback	print_excclose)r    re   sessions      r!   r`   !PromptToolkitSSHSession._interactS   sB    ::JKK4:://DJJ4F4F4R JJ$$U+zz++-#KKd
  DK#$++dllKw#* (-----
 JJ$$&KK%%' L !  .$ *'')* JJ$$&KK%%' LK ! sx   B8G:$F6F%&E:E;E?4F%4F6<	GEE)&E,(E))E,,6F""F%%
F3	/F66
G Gc                    U R                   (       aA  U R                   R                  (       a%  U R                   R                  R                  5         g g g r+   )rD   app
_on_resizerP   s        r!   terminal_size_changed-PromptToolkitSSHSession.terminal_size_changedo   s;      0 0 4 4  ++- !5r)   c                V    U R                   c  g U R                   R                  U5        g r+   )rE   	send_text)r    r   datatypes      r!   data_received%PromptToolkitSSHSession.data_receivedv   s!    ;;d#r)   )r   rE   rF   rD   rB   rA   rC   rG   NrA   z>Callable[[PromptToolkitSSHSession], Coroutine[Any, Any, None]]rB   r7   r4   r5   )r4   r   )rX   r   r4   r5   r6   r8   )
rQ   intrR   r}   rS   objectrT   r~   r4   r5   )r   r/   ry   r~   r4   r5   )r9   r:   r;   r<   rH   rU   rY   r\   ra   r`   ru   rz   r>   r%   r)   r!   r   r      sp    '-P'- 	'-
 
'-R4N(8.."%.17.DJ.	.$r)   c                  H    \ rS rSrSrSS.     S
S jjrSS jrSS jrSrg	)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_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rB   c                   Xl         X l        g r+   )rA   rB   )r    rA   rB   s      r!   rH   PromptToolkitSSHServer.__init__   s     !$r)   c                    g)NFr%   )r    usernames     r!   
begin_auth!PromptToolkitSSHServer.begin_auth   s    r)   c                >    [        U R                  U R                  S9$ )Nr   )r   rA   rB   r?   s    r!   session_requested(PromptToolkitSSHServer.session_requested   s    &t}}QQr)   )rB   rA   Nr|   )r   r/   r4   r7   )r4   r   )	r9   r:   r;   r<   __doc__rH   r   r   r>   r%   r)   r!   r   r   ~   s9    #R  	%P% 	%
 
%Rr)   )r   
__future__r   asynciorm   r   typingr   r   r   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!   <module>r      sa    #   $ 9 9  M / = 4$&>
?e$h77 e$P4RX// 4Rr)   