o
    ;ic                     @   s   d dl Z d dlZd dlZd dl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 ddee
e e
e f fddZd	efd
dZejdd Zd	edefddZejdde	eegef fddZdS )    N)	Coroutine)CallableOptional   )asyncifyreturnc                 C   sZ   z"| du r
t j } ddl}ddl}ddl}|d|| |jdW S  t	y,   Y dS w )z"Get the window size of a terminal.Nr   hh1234)NN)
sysstdinfilenofcntlstructtermiosunpackioctl
TIOCGWINSZ	Exception)fdr   r   r    r   L/home/ubuntu/.local/lib/python3.10/site-packages/modal/_utils/shell_utils.py	get_winsz   s   
r   r   c                 C   s0   ddl }| | |j}| | |j|tjB  dS )z+Set a file descriptor to non-blocking mode.r   N)r   F_GETFLF_SETFLos
O_NONBLOCK)r   r   flr   r   r   set_nonblocking"   s   r   c                  c   sd    ddl } ddl}tj }| |}z||| j dV  W | || j| dS | || j| w )z3Context manager that puts the terminal in raw mode.r   N)	r   ttyr
   r   r   	tcgetattrsetraw	TCSADRAIN	tcsetattr)r   r   r   old_settingsr   r   r   raw_terminal*   s   

&r$   datac                    s2   t    fdd}| S )Nc               
      s   zt  }  | d    s d  W d S W d S  tyH } z|jtjkr3W Y d }~d S  | W Y d }~d S d }~ww N)r   writeremove_writer
set_resultOSErrorerrnoEAGAINset_exception)nbyteser%   r   futureloopr   r   	try_writeC   s   

zwrite_to_fd.<locals>.try_write)asyncioget_event_loopcreate_future
add_writer)r   r%   r3   r   r0   r   write_to_fd?   s
   r8   Fhandle_inputc                   s   t  \}ttj  tdtt ffdd  fdd}t	
| }|rAt  dV  W d   n1 s;w   Y  ndV  t |d |  dS )zEStream from terminal stdin to the handle_input provided by the methodr   c                     sF   t  tjj gg g d\} }} | v rd S tjj| v r!tjj S dS )N       )selectr
   r   bufferread)readable_)quit_pipe_readr   r   _read_stdin^   s   z&stream_from_stdin.<locals>._read_stdinc                     s:   d} 	   I d H }|d u rd S || I d H  | d7 } q)Nr   r   )message_indexr%   )rB   r9   r   r   _writej   s   z!stream_from_stdin.<locals>._writeN   
)r   piper   r
   r   r   r   r   bytesr4   create_taskr$   r'   cancel)r9   use_raw_terminalquit_pipe_writerD   
write_taskr   )rB   r9   rA   r   stream_from_stdinW   s   rM   r&   )F)r4   
contextlibr+   r   r<   r
   collections.abcr   typingr   r   async_utilsr   tupleintr   r   contextmanagerr$   rG   r8   asynccontextmanagerrM   r   r   r   r   <module>   s     
"