o
    Lj=                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	m
Z
 ddlmZmZmZmZ ddlmZ ddlmZmZmZ dd	lmZmZmZmZ dd
lmZmZmZ e Zee dZ e!e dd Z"de#de$fddZ%de$fddZ&G dd de	ddZ'G dd deeZ(G dd deeZ)dS )    N)	getLogger)CallableListOptional	TypedDictUnion   )ConnectionErrorInvalidResponse
RedisErrorTimeoutError)
EncodableT)HIREDIS_AVAILABLESENTINELdeprecated_function   )AsyncBaseParserAsyncPushNotificationsParser
BaseParserPushNotificationsParser)#NONBLOCKING_EXCEPTION_ERROR_NUMBERSNONBLOCKING_EXCEPTIONSSERVER_CLOSED_CONNECTION_ERRORpoll	POLLRDHUPtimeoutreturnc                 C   s   t | dr|  rdS tr)t }|| tj |d u rd n|d }t||S t	 }|| tj
 t||W  d    S 1 sFw   Y  d S )NpendingTi  )hasattrr   	_HAS_POLLselectr   registerPOLLINbool	selectorsDefaultSelector
EVENT_READ)sockr   pollerpoll_timeoutselector r+   T/home/djax/ivt_ai_plugin/venv/lib/python3.10/site-packages/redis/_parsers/hiredis.py_socket_can_read#   s   
$r-   c                 C   s   t sdS t| dr|  rdS t }|| tjtB  |d}|s%dS |d \}}z
| dt	j
dkW S  ty?   Y dS  tyX   tjtjB tjB tB }t||@  Y S  tya   Y dS w )NFr   r   r       T)r   r   r   r    r   r!   r"   
_POLLRDHUPrecvsocketMSG_PEEKr   
ValueErrorPOLLHUPPOLLERRPOLLNVALr#   OSError)r'   r(   events_reventsclosed_flagsr+   r+   r,   _socket_is_closed;   s(   
r<   c                   @   sJ   e Zd ZU eegef ed< eegef ed< ee ed< ee ed< dS )_HiredisReaderArgsprotocolError
replyErrorencodingerrorsN)__name__
__module____qualname__r   str	Exception__annotations__r   r+   r+   r+   r,   r=   d   s
   
 r=   F)totalc                   @   sx   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdde	de
fddZedfddZddefdee	ef fddZdS )_HiredisParserz*Parser class for connections using Hiredisc                 C   sF   t std|| _t|| _| j| _d | _d | _d | _	d | _
d | _d S )NzHiredis is not installed)r   r   socket_read_size	bytearray_bufferhandle_pubsub_push_responsepubsub_push_handler_funcnode_moving_push_handler_funcmaintenance_push_handler_func#oss_cluster_maint_push_handler_funcinvalidation_push_handler_func_hiredis_PushNotificationTypeselfrJ   r+   r+   r,   __init__n   s   

z_HiredisParser.__init__c                 C   s$   z|    W d S  ty   Y d S w N)on_disconnectrF   rU   r+   r+   r,   __del__z   s
   z_HiredisParser.__del__c                 C   s   t d}|dt|  |S Npush_responsezPush response: r   debugrE   rU   responseloggerr+   r+   r,   rM      s   z*_HiredisParser.handle_pubsub_push_responsec                 K   s|   dd l }|j| _|j| _t| j|jjtd}|jj	r |jj
|d< |jdi || _z|j| _W d S  ty=   d | _Y d S w )Nr   )r>   r?   rA   notEnoughDatar@   r+   )hiredis_socksocket_timeout_socket_timeoutr
   parse_errorencoderencoding_errorsNOT_ENOUGH_DATAdecode_responsesr@   Reader_readerPushNotificationrS   AttributeError)rU   
connectionkwargsrc   r+   r+   r,   
on_connect   s    z_HiredisParser.on_connectc                 C   s   d | _ d | _d S rW   )rd   rm   rY   r+   r+   r,   rX      s   
z_HiredisParser.on_disconnectr   r   r   c                 C   sB   | j stt| j  rdS t| j|sdS t| jrttdS )NTF)rm   r	   r   has_datar-   rd   r<   )rU   r   r+   r+   r,   can_read   s   

z_HiredisParser.can_readTc           	   
   C   sH  | j }| j}|d u s|d u rtt|tu}zz+|r|| || j}|dkr-tt|| jd| W W |rA|| j	 dS dS  t
jy^   |rPtdY W |r\|| j	 dS dS  ty } z0t|jd}|j|kr|sW Y d }~W |r|| j	 dS dS |dkrtdtd|j d }~ww |r|| j	 w w )Nr   TzTimeout reading from socketFz!Error while reading from socket: )rd   rm   r	   r   r   
settimeout	recv_intorL   feedrf   r1   r   r   r   r   get	__class__errnoargs)	rU   r   raise_on_timeoutr'   readercustom_timeoutbufflenexallowedr+   r+   r,   read_from_socket   sN   

z_HiredisParser.read_from_socketFc                 C   s   | j }|d u rtt|r|d}n| }|tu r1| j|d |r)|d}n| }|tu st|tr8|| jd urTt|| jrT| |}|rL|S | j	|||dS t|t
rf|rft|d trf|d |S )NF)r   )disable_decodingpush_requestr   r   )rm   r	   r   getsrj   r   
isinstancerS   handle_push_responseread_responselist)rU   r   r   r   r~   r`   r+   r+   r,   r      sB   	
	
z_HiredisParser.read_responseN)r   )rB   rC   rD   __doc__rV   rZ   rM   rr   rX   floatr#   rt   r   r   r   objectr   r+   r+   r+   r,   rI   k   s    *
rI   c                
       s   e Zd ZdZdZdef fddZdd Zdd	 Zd
d Z	e
dddddefddZdefddZdd Z	ddededeeee f fddZ  ZS )_AsyncHiredisParserzBAsync implementation of parser class for connections using Hiredis)rm   rJ   c                    s8   t stdt j|d d | _| j| _d | _d | _d S )NzHiredis is not available.)rJ   )	r   r   superrV   rm   rM   rN   rR   rS   rT   rz   r+   r,   rV     s   
z_AsyncHiredisParser.__init__c                    s    t d}|dt|  |S r[   r]   r_   r+   r+   r,   rM     s   z/_AsyncHiredisParser.handle_pubsub_push_responsec                 C   s   dd l }|j| _t| jtd}|jjr|jj|d< |jj	|d< |j
di || _d| _z
t|dd | _W d S  tyB   d | _Y d S w )Nr   )r>   r?   rb   r@   rA   Trn   r+   )rc   rm   _streamr
   rg   rj   rh   rk   r@   ri   rl   
_connectedgetattrrS   ro   )rU   rp   rc   rq   r+   r+   r,   rr      s$   z_AsyncHiredisParser.on_connectc                 C   s
   d| _ d S )NF)r   rY   r+   r+   r,   rX   8  s   
z!_AsyncHiredisParser.on_disconnectz8.0.0zUse can_read() insteadcan_read_destructive)versionreasonnamer   c                    s   |   I d H S rW   )rt   rY   r+   r+   r,   r   ;  s   z(_AsyncHiredisParser.can_read_destructivec                    s4   | j std| j s| j rdS t| jjS )NzBuffer is closed.T)r   r7   rm   rs   r   at_eofr#   rL   rY   r+   r+   r,   rt   A  s   z_AsyncHiredisParser.can_readc                    s>   | j | jI d H }|rt|tsttd | j| dS )NT)	r   read
_read_sizer   bytesr	   r   rm   rx   )rU   bufferr+   r+   r,   r   N  s   
z$_AsyncHiredisParser.read_from_socketFr   r   c                    s   | j s	ttd |r| jd}n| j }|tu r4|  I d H  |r+| jd}n| j }|tu st|tr;|| jd ur\t|| jr\| 	|I d H }|sZ| j
||dI d H S |S t|trn|rnt|d trn|d |S )NF)r   r   r   )r   r	   r   rm   r   rj   r   r   rS   r   r   r   )rU   r   r   r`   r+   r+   r,   r   W  s>   




z!_AsyncHiredisParser.read_response)FF)rB   rC   rD   r   	__slots__intrV   rM   rr   rX   r   r#   r   rt   r   r   r   r   r   __classcell__r+   r+   r   r,   r     s*    	
r   )*r    r$   r1   loggingr   typingr   r   r   r   r   
exceptionsr	   r
   r   r   r   utilsr   r   r   baser   r   r   r   r   r   r   r   rj   r   r   r   r/   r   r#   r-   r<   r=   rI   r   r+   r+   r+   r,   <module>   s&    	
) #