o
    tBh'                     @  s   U d Z ddlm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 ddlmZ ejdkrQddlZddlZeZejjZejZded	< ejZded
< nddlZejZG dd deZG dd dZG dd deZG dd deZdS )zCross platform abstractions for inter-process communication

On Unix, this uses AF_UNIX sockets.
On Windows, this uses NamedPipes.
    )annotationsN)TracebackType)Callable)Finalwin32zCallable[[_IPCHandle], int]DisconnectNamedPipeFlushFileBuffersc                   @  s   e Zd ZdZdS )IPCExceptionzException for IPC issues.N)__name__
__module____qualname____doc__ r   r   _/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/mypy/ipc.pyr	   #   s    r	   c                   @  sD   e Zd ZU dZded< dd
dZddddZdddZdddZdS )IPCBasezBase class for communication between the dmypy client and server.

    This contains logic shared between the client and server, such as reading
    and writing.
    
_IPCHandle
connectionnamestrtimeoutfloat | NonereturnNonec                 C  s   || _ || _d S N)r   r   )selfr   r   r   r   r   __init__0   s   
zIPCBase.__init__順 sizeintbytesc           	      C  s  t  }tjdkrs	 tj| j|dd\}}z'|tjkr:| jr$t| jd ntj	}t
|j|}|tjkr:td| W n tyG   |   w |d\}}| }|rZ|| |dkrc	 t|S |tjkriq|tjkrrtdq		 | j|}|s	 t|S || qt)z2Read bytes from an IPC connection until its empty.r   T
overlapped  Bad result from I/O wait: r   zReadFile operation aborted.)	bytearraysysplatform_winapiReadFiler   ERROR_IO_PENDINGr   r   INFINITEWaitForSingleObjecteventWAIT_OBJECT_0r	   BaseExceptioncancelGetOverlappedResult	getbufferextendERROR_MORE_DATAERROR_OPERATION_ABORTEDrecvr   )	r   r   bdataoverrr   res_morer   r   r   read4   sD   






zIPCBase.readdatac              
   C  s<  t jdkrzttj| j|dd\}}t|tjsJ t|ts J z3|tjkrG| j	r0t| j	d ntj
}t|j|}|tjkrFtd| n|dkrRtd| W n ty_   |   w |d\}}|dksoJ ||t|kswJ W d	S  ty } z	td|j |d	}~ww | j| | jtj d	S )
z!Write bytes to an IPC connection.r   Tr    r"   r#   r   z#Failed writing to pipe with error: zFailed to write with error: N)r%   r&   r'   	WriteFiler   
isinstance
Overlappedr   r)   r   r*   r+   r,   r-   r	   r.   r/   r0   lenOSErrorwinerrorsendallshutdownsocketSHUT_WR)r   r=   r7   r8   r   r9   bytes_writtener   r   r   writeW   s8   


zIPCBase.writec                 C  s8   t jdkr| jtjkrt| j d S d S | j  d S Nr   )r%   r&   r   r'   NULLCloseHandlecloser   r   r   r   rN   s   s
   
zIPCBase.closeNr   r   r   r   r   r   )r   )r   r   r   r   )r=   r   r   r   r   r   )	r
   r   r   r   __annotations__r   r<   rJ   rN   r   r   r   r   r   '   s   
 

#r   c                      s>   e Zd ZdZd fdd	Zdd
dZ			ddddZ  ZS )	IPCClientz%The client side of an IPC connection.r   r   r   r   r   r   c              
     sB  t  || tjdkr| jrt| jd ntj}z	t| j	| W n- t
y8 } z
td| j	 d|d }~w tyO } z|jtjkrJtd| d }~ww zt| j	tjtjB dtjtjtjtj| _W n ty } z|jtjkrztd| d }~ww t| jtjd d  d S ttj| _| j| | j| d S )Nr   r"   zThe NamedPipe at z was not found.z!Timed out waiting for connection.r   zThe connection is busy.)superr   r%   r&   r   r   r'   NMPWAIT_WAIT_FOREVERWaitNamedPiper   FileNotFoundErrorr	   rB   rC   ERROR_SEM_TIMEOUT
CreateFileGENERIC_READGENERIC_WRITErL   OPEN_EXISTINGFILE_FLAG_OVERLAPPEDr   ERROR_PIPE_BUSYSetNamedPipeHandleStatePIPE_READMODE_MESSAGErF   AF_UNIX
settimeoutconnect)r   r   r   rI   	__class__r   r   r   ~   sH   



	
zIPCClient.__init__c                 C  s   | S r   r   rO   r   r   r   	__enter__   s   zIPCClient.__enter__Nexc_tytype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Nonec                 C  s   |    d S r   )rN   r   rg   ri   rk   r   r   r   __exit__   s   zIPCClient.__exit__rP   )r   rS   NNNrg   rh   ri   rj   rk   rl   r   r   )r
   r   r   r   r   rf   rn   __classcell__r   r   rd   r   rS   {   s    
$rS   c                      sb   e Zd ZU dZded< dd fddZdddZ			ddddZd ddZe	d!ddZ
  ZS )"	IPCServeri   r   BUFFER_SIZENr   r   r   r   r   r   c              
     s  t jdkrd|ttd }n| d}t 	|| t jdkrXt
| jt
jt
jB t
jB t
jt
jB t
jB dB d| j| jt
jd| _| jdkrVt
 }td	| d S t | _tj| j| j}ttj| _| j | | j!d |d ur| j"| d S d S )
Nr   z\\.\pipe\{}-{}.pipe   z.sock      r   zInvalid handle to pipe: )#r%   r&   formatbase64urlsafe_b64encodeosurandomdecoderT   r   r'   CreateNamedPiper   PIPE_ACCESS_DUPLEXFILE_FLAG_FIRST_PIPE_INSTANCEr]   r`   PIPE_TYPE_MESSAGE	PIPE_WAITrs   rU   r   GetLastErrorr	   tempfilemkdtempsock_directorypathjoinrF   ra   sockbindlistenrb   )r   r   r   r8   sockfilerd   r   r   r      sN   




zIPCServer.__init__c              
   C  s$  t jdkrtztj| jdd}t|tjsJ W n ty4 } z|jtj	tj
fvr) W Y d }~| S d }~ww z| jr@t| jd ntj}t|j|}|tjksQJ W n tyd   |  t| j  w |d\}}|dksrJ | S z| j \| _}W | S  tjy } ztd|d }~ww )Nr   Tr    r"   r   zThe socket timed out)r%   r&   r'   ConnectNamedPiper   r?   r@   rB   rC   ERROR_PIPE_CONNECTEDERROR_NO_DATAr   r   r*   r+   r,   r-   r.   r/   rM   r0   r   acceptrF   r	   )r   r7   rI   r   r9   r:   r8   r   r   r   rf      s<   


zIPCServer.__enter__rg   rh   ri   rj   rk   rl   c                 C  sF   t jdkrzt| jstdW t| j d S t| j w |   d S )Nr   z:Failed to flush NamedPipe buffer,maybe the client hung up?)r%   r&   r   r   r	   r   rN   rm   r   r   r   rn      s   

zIPCServer.__exit__c                 C  s&   t jdkr|   d S t| j d S rK   )r%   r&   rN   shutilrmtreer   rO   r   r   r   cleanup  s   
zIPCServer.cleanupc                 C  s   t jdkr| jS | j S rK   )r%   r&   r   r   getsocknamerO   r   r   r   connection_name  s   

zIPCServer.connection_namer   rP   )r   rr   ro   rp   rQ   )r   r   )r
   r   r   rs   rR   r   rf   rn   r   propertyr   rq   r   r   rd   r   rr      s   
 
$ 
rr   )r   
__future__r   ry   r{   r   r%   r   typesr   typingr   typing_extensionsr   r&   ctypesr'   r   r   windllkernel32r   rR   r   rF   	Exceptionr	   r   rS   rr   r   r   r   r   <module>   s.    
T3