o
    <‘ði<+  ã                   @   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
 ejjdkr3ejjdkr3d dl mZ nd dlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZmZmZmZ ddlmZmZmZmZ e ƒ 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é   é   )Útimeouté   )ÚConnectionErrorÚInvalidResponseÚ
RedisError)Ú
EncodableT)ÚHIREDIS_AVAILABLEé   )ÚAsyncBaseParserÚAsyncPushNotificationsParserÚ
BaseParserÚPushNotificationsParser)Ú#NONBLOCKING_EXCEPTION_ERROR_NUMBERSÚNONBLOCKING_EXCEPTIONSÚSENTINELÚSERVER_CLOSED_CONNECTION_ERRORc                   @   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%   úU/root/parts/websockify/install/lib/python3.10/site-packages/redis/_parsers/hiredis.pyr   "   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„ Z	e
dfdd„Zd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©Úselfr)   r%   r%   r&   Ú__init__,   s   

z_HiredisParser.__init__c                 C   s$   z|   ¡  W d S  ty   Y d S w ©N)Úon_disconnectr#   ©r4   r%   r%   r&   Ú__del__8   s
   ÿz_HiredisParser.__del__c                 C   s   t dƒ}| dt|ƒ ¡ |S ©NÚpush_responsezPush response: ©r   Údebugr"   ©r4   ÚresponseÚloggerr%   r%   r&   r,   >   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 |¤Ž| _t| _z|j| _W d S  ty@   d | _Y d S w )Nr   )r   r   r   ÚnotEnoughDatar   r%   )ÚhiredisÚ_sockÚsocket_timeoutÚ_socket_timeoutr   Úparse_errorÚencoderÚencoding_errorsÚNOT_ENOUGH_DATAÚdecode_responsesr   ÚReaderÚ_readerÚ_next_responseÚPushNotificationr2   ÚAttributeError)r4   Ú
connectionÚkwargsrB   r%   r%   r&   Ú
on_connectC   s"   üþz_HiredisParser.on_connectc                 C   s   d | _ d | _t| _d S r6   )rC   rL   rI   rM   r8   r%   r%   r&   r7   Z   s   
z_HiredisParser.on_disconnectc                 C   s@   | j sttƒ‚| jtu r| j  ¡ | _| jtu r| j|dd�S dS )NF)r
   Úraise_on_timeoutT)rL   r   r   rM   rI   ÚgetsÚread_from_socket)r4   r
   r%   r%   r&   Úcan_read_   s   

z_HiredisParser.can_readTc              
   C   s  | j }|tu}z}z-|r| |¡ | j  | j¡}|dkrttƒ‚| j | jd|¡ W W |r4| | j	¡ dS dS  t
jyQ   |rCtdƒ‚Y W |rO| | j	¡ dS dS  ty„ } z(t |jd¡}|sx|j|krxW Y d }~W |rv| | j	¡ dS dS td|j› �ƒ‚d }~ww |rŽ| | j	¡ w w )Nr   TzTimeout reading from socketFéÿÿÿÿz!Error while reading from socket: )rC   r   Ú
settimeoutÚ	recv_intor+   r   r   rL   ÚfeedrE   Úsocketr
   ÚTimeoutErrorr   r   ÚgetÚ	__class__ÚerrnoÚargs)r4   r
   rS   ÚsockÚcustom_timeoutÚbufflenÚexÚallowedr%   r%   r&   rU   i   sB   
ÿòÿöÿþ€ø
ÿz_HiredisParser.read_from_socketFc                 C   s  | j sttƒ‚| jtur/| j}t| _| jd ur-t|| jƒr-|  |¡}|r&|S | j||d�S |S |r8| j  	d¡}n| j  	¡ }|tu rW|  
¡  |rN| j  	d¡}n| j  	¡ }|tu sAt|tƒr^|‚| jd uryt|| jƒry|  |¡}|rr|S | j||d�S t|tƒr‹|r‹t|d tƒr‹|d ‚|S )N©Údisable_decodingÚpush_requestFr   )rL   r   r   rM   rI   r2   Ú
isinstanceÚhandle_push_responseÚread_responserT   rU   Úlist©r4   rg   rh   r?   r%   r%   r&   rk   ‡   sZ   
ÿ
þ

û
	ÿ
þÿþýz_HiredisParser.read_responseN©FF)r   r    r!   Ú__doc__r5   r9   r,   rR   r7   rV   r   rU   rk   r%   r%   r%   r&   r(   )   s    
r(   c                
       sx   e Zd ZdZdZdef‡ fdd„Zdd„ Zdd	„ Zd
d„ Z	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)rL   r)   c                    s8   t stdƒ‚tƒ j|d� d | _| j| _d | _d | _d S )NzHiredis is not available.)r)   )	r   r   Úsuperr5   rL   r,   r-   r1   r2   r3   ©r^   r%   r&   r5   Ç   s   
z_AsyncHiredisParser.__init__c                 Ã   s    �t dƒ}| dt|ƒ ¡ |S r:   r<   r>   r%   r%   r&   r,   Ð   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   rA   r   r   TrN   r%   )rB   rL   Ú_streamr   rF   rI   rG   rJ   r   rH   rK   Ú
_connectedÚgetattrr2   rO   )r4   rP   rB   rQ   r%   r%   r&   rR   Õ   s$   ýÿþz_AsyncHiredisParser.on_connectc                 C   s
   d| _ d S )NF)rt   r8   r%   r%   r&   r7   í   s   
z!_AsyncHiredisParser.on_disconnectc              	   Ã   sŒ   �| j stdƒ‚| j ¡ turdS z)tdƒ4 I d H š |  ¡ I d H W  d   ƒI d H  W S 1 I d H s3w   Y  W d S  tjyE   Y dS w )NzBuffer is closed.Tr   F)	rt   ÚOSErrorrL   rT   rI   Úasync_timeoutrU   Úasyncior\   r8   r%   r%   r&   Úcan_read_destructiveð   s   €4ÿÿz(_AsyncHiredisParser.can_read_destructivec                 Ã   s>   �| j  | j¡I d H }|rt|tƒsttƒd ‚| j |¡ dS )NT)	rs   ÚreadÚ
_read_sizeri   Úbytesr   r   rL   rZ   )r4   Úbufferr%   r%   r&   rU   û   s   €
z$_AsyncHiredisParser.read_from_socketFrg   rh   Úreturnc                 Ã   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 )NFrf   r   )rt   r   r   rL   rT   rI   rU   ri   r2   rj   rk   rl   rm   r%   r%   r&   rk     s>   €


û

ÿÿÿþýz!_AsyncHiredisParser.read_responsern   )r   r    r!   ro   Ú	__slots__Úintr5   r,   rR   r7   ry   rU   Úboolr   r   r   rk   Ú__classcell__r%   r%   rr   r&   rp   Â   s"    	
ÿÿÿþrp   )%rx   r[   ÚsysÚloggingr   Útypingr   r   r   r   r   Úversion_infoÚmajorÚminorr
   rw   Ú
exceptionsr   r   r   r   Úutilsr   Úbaser   r   r   r   r   r   r   r   ÚobjectrI   r   r(   rp   r%   r%   r%   r&   Ú<module>   s$    
 