o
    <‘ðiO  ã                   @   sb  U d dl Z d dl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mZmZ d dlmZmZmZmZmZmZmZmZ d dlmZ ejjdkrVejjdkrVd d	lmZ nd d	lmZ d
dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d
dlm2Z2 ddl3m4Z4 ddl5m6Z6m7Z7 dZ8dZ9dZ:dZ;e!e!dœZ<de(iZ=e  >e?¡Z@G dd„ deƒZAG dd„ deAƒZBG dd„ deAƒZCG dd„ dƒZDdZEdZFd ZGd!ZHd"ZId#ZJd$ZKd%ZLeGeHeIeJeKfZMeGeeDjNfeHeeDjOfeIeeDjNfeJeeDjOfeFeeDjPfeKeeDjQfeLeeDjRfiZSeTeUeVeWe e
f f eXd&< G d'd(„ d(eƒZYG d)d*„ d*eƒZZG d+d,„ d,eCƒZ[dS )-é    N)ÚABC)ÚIncompleteReadErrorÚStreamReaderÚTimeoutError)Ú	AwaitableÚCallableÚListÚOptionalÚProtocolÚUnion)ÚMaintenanceNotificationÚNodeFailedOverNotificationÚNodeFailingOverNotificationÚNodeMigratedNotificationÚNodeMigratingNotificationÚNodeMovingNotificationÚOSSNodeMigratedNotificationÚOSSNodeMigratingNotification)Úsafe_stré   é   )Útimeouté   )ÚAskErrorÚAuthenticationErrorÚ$AuthenticationWrongNumberOfArgsErrorÚBusyLoadingErrorÚClusterCrossSlotErrorÚClusterDownErrorÚConnectionErrorÚExecAbortErrorÚExternalAuthProviderErrorÚMasterDownErrorÚModuleErrorÚ
MovedErrorÚNoPermissionErrorÚNoScriptErrorÚOutOfMemoryErrorÚReadOnlyErrorÚResponseErrorÚTryAgainError)Ú
EncodableTé   )ÚEncoder)ÚSERVER_CLOSED_CONNECTION_ERRORÚSocketBufferz:Error loading the extension. Please check the server logs.z5Error unloading module: no such module with that namez/Error unloading module: operation not possible.z[Error unloading module: the module exports one or more module-side data types, can't unload)zxAUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?z(Client sent AUTH, but no password is setzproblem with LDAP servicec                   @   st   e Zd Zdedededeeeeee	ee
eie¥e¥eeeeeeeeeeeeeedœZedd„ ƒZdd	„ Zd
d„ ZdS )Ú
BaseParserzmax number of clients reachedzinvalid passwordz,wrong number of arguments for 'auth' commandz,wrong number of arguments for 'AUTH' command)ÚERRÚOOMÚ	WRONGPASSÚ	EXECABORTÚLOADINGÚNOSCRIPTÚREADONLYÚNOAUTHÚNOPERMÚASKÚTRYAGAINÚMOVEDÚCLUSTERDOWNÚ	CROSSSLOTÚ
MASTERDOWNc                 C   s`   |  d¡d }|| jv r,|t|ƒd d… }| j| }t|tƒr&| |t¡}|||d�S t|ƒS )zParse an error responseú r   r,   N)Ústatus_code)ÚsplitÚEXCEPTION_CLASSESÚlenÚ
isinstanceÚdictÚgetr)   )ÚclsÚresponseÚ
error_codeÚexception_class© rL   úR/root/parts/websockify/install/lib/python3.10/site-packages/redis/_parsers/base.pyÚparse_errorm   s   


zBaseParser.parse_errorc                 C   ó   t ƒ ‚©N©ÚNotImplementedError©ÚselfrL   rL   rM   Úon_disconnecty   ó   zBaseParser.on_disconnectc                 C   rO   rP   rQ   ©rT   Ú
connectionrL   rL   rM   Ú
on_connect|   rV   zBaseParser.on_connectN)Ú__name__Ú
__module__Ú__qualname__r   r   r   ÚMODULE_LOAD_ERRORr#   ÚMODULE_EXPORTS_DATA_TYPES_ERRORÚNO_SUCH_MODULE_ERRORÚ MODULE_UNLOAD_NOT_POSSIBLE_ERRORÚNO_AUTH_SET_ERRORÚEXTERNAL_AUTH_PROVIDER_ERRORr'   r    r   r&   r(   r%   r   r*   r$   r   r   r"   rC   ÚclassmethodrN   rU   rY   rL   rL   rL   rM   r0   I   sF    òñðà#
r0   c                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú	_RESPBasez&Base class for sync-based resp parsingc                 C   s   || _ d | _d | _d | _d S rP   )Úsocket_read_sizeÚencoderÚ_sockÚ_buffer©rT   re   rL   rL   rM   Ú__init__ƒ   s   
z_RESPBase.__init__c                 C   s$   z|   ¡  W d S  ty   Y d S w rP   )rU   Ú	ExceptionrS   rL   rL   rM   Ú__del__‰   s
   ÿz_RESPBase.__del__c                 C   s(   |j | _ t| j | j|jƒ| _|j| _dS )zCalled when the socket connectsN)rg   r/   re   Úsocket_timeoutrh   rf   rW   rL   rL   rM   rY   �   s
   ÿz_RESPBase.on_connectc                 C   s*   d| _ | jdur| j ¡  d| _d| _dS )z"Called when the socket disconnectsN)rg   rh   Úcloserf   rS   rL   rL   rM   rU   —   s
   


z_RESPBase.on_disconnectc                 C   s   | j o| j  |¡S rP   )rh   Úcan_read)rT   r   rL   rL   rM   ro   Ÿ   s   z_RESPBase.can_readN)	rZ   r[   r\   Ú__doc__rj   rl   rY   rU   ro   rL   rL   rL   rM   rd   €   s    rd   c                
   @   sV   e Zd ZdZdZdefdd„Zdefdd„Z		dd
ede	e
edee
 f fdd„ZdS )ÚAsyncBaseParserz5Base parsing class for the python-backed async parser©Ú_streamÚ
_read_sizere   c                 C   s   d | _ || _d S rP   rr   ri   rL   rL   rM   rj   ¨   s   
zAsyncBaseParser.__init__Úreturnc                 Ã   ó   �t ƒ ‚rP   rQ   rS   rL   rL   rM   Úcan_read_destructive¬   s   €z$AsyncBaseParser.can_read_destructiveFÚdisable_decodingNc                 Ã   rv   rP   rQ   )rT   rx   rL   rL   rM   Úread_response¯   s   €zAsyncBaseParser.read_response)F)rZ   r[   r\   rp   Ú	__slots__Úintrj   Úboolrw   r   r+   r)   r   ry   rL   rL   rL   rM   rq   £   s    ÿÿþrq   c                   @   sL   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZedd	„ ƒZed
d„ ƒZ	dS )ÚMaintenanceNotificationsParserzEProtocol defining maintenance push notification parsing functionalityc                 C   s   | d }t | d ƒ}t||ƒS ©Nr,   r   )r   r   )rI   ÚidÚslotsrL   rL   rM   Úparse_oss_maintenance_start_msg¸   s   
z>MaintenanceNotificationsParser.parse_oss_maintenance_start_msgc           
      C   sh   | d }| d }i }|D ]"\}}}t |ƒ}t |ƒ}t |ƒ}	||vr%g ||< ||  ||	i¡ qt||ƒS r~   )r   Úappendr   )
rI   r   Únodes_to_slots_mapping_dataÚnodes_to_slots_mappingÚsrc_nodeÚ	dest_noder€   Úsrc_node_strÚdest_node_strÚ	slots_strrL   rL   rM   Ú#parse_oss_maintenance_completed_msgÀ   s   	
zBMaintenanceNotificationsParser.parse_oss_maintenance_completed_msgc                 C   s   | d }| d }|||ƒS r~   rL   )rI   Únotification_typer   ÚttlrL   rL   rM   Úparse_maintenance_start_msgÚ   s   
z:MaintenanceNotificationsParser.parse_maintenance_start_msgc                 C   s   | d }||ƒS )Nr,   rL   )rI   r‹   r   rL   rL   rM   Úparse_maintenance_completed_msgä   s   z>MaintenanceNotificationsParser.parse_maintenance_completed_msgc                 C   sb   | d }| d }| d d u rd\}}nt | d ƒ}| d¡\}}|d ur(t|ƒnd }t||||ƒS )Nr,   r   r   )NNú:)r   rB   r{   r   )rI   r   rŒ   ÚhostÚportÚvaluerL   rL   rM   Úparse_moving_msgí   s   
z/MaintenanceNotificationsParser.parse_moving_msgN)
rZ   r[   r\   rp   Ústaticmethodr�   rŠ   r�   rŽ   r“   rL   rL   rL   rM   r}   µ   s    


	
r}   Ú
invalidateÚMOVINGÚ	MIGRATINGÚMIGRATEDÚFAILING_OVERÚFAILED_OVERÚ
SMIGRATINGÚ	SMIGRATEDÚ-MSG_TYPE_TO_MAINT_NOTIFICATION_PARSER_MAPPINGc                   @   s’   e Zd ZU dZeed< dZee ed< dZee ed< dZ	ee ed< dZ
ee ed< dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚPushNotificationsParserz6Protocol defining RESP3-specific parsing functionalityÚpubsub_push_handler_funcNÚinvalidation_push_handler_funcÚnode_moving_push_handler_funcÚmaintenance_push_handler_funcÚ#oss_cluster_maint_push_handler_funcc                 C   rO   )zHandle pubsub push responsesrQ   ©rT   rI   rL   rL   rM   Úhandle_pubsub_push_response8  s   z3PushNotificationsParser.handle_pubsub_push_responsec              
   K   s„  |d }t |tƒr| ¡ }|tgt¢t‘t‘R vr|  |¡S z†|tkr,| jr,|  |¡W S |tkrC| j	rCt
| d }||ƒ}|  	|¡W S |tv rn| jrnt
| d }|tkrY||ƒ}nt
| d }|||ƒ}|d urn|  |¡W S |tkr™| jsx| jrŸt
| d }||ƒ}|d urœ| jrŽ|  |¡ | jr¢|  |¡ W d S W d S W d S W d S W d S  tyÁ } zt d |||¡¡ W Y d }~d S d }~ww )Nr   r,   ú"Error handling {} message ({}): {}©rE   ÚbytesÚdecodeÚ_INVALIDATION_MESSAGEÚ_MAINTENANCE_MESSAGESÚ_MOVING_MESSAGEÚ_SMIGRATED_MESSAGErŸ   r    r¡   r�   r¢   Ú_SMIGRATING_MESSAGEr£   rk   ÚloggerÚerrorÚformat©rT   rI   ÚkwargsÚmsg_typeÚparser_functionÚnotificationr‹   ÚerL   rL   rM   Úhandle_push_response<  s”   
ÿþýü
ÿÿþÿþ
ÿþ
ÿþÿþ
íö
íùûÿ€ûz,PushNotificationsParser.handle_push_responsec                 C   ó
   || _ d S rP   ©rŸ   ©rT   rŸ   rL   rL   rM   Úset_pubsub_push_handler{  ó   
z/PushNotificationsParser.set_pubsub_push_handlerc                 C   r¹   rP   ©r    ©rT   r    rL   rL   rM   Úset_invalidation_push_handler~  r½   z5PushNotificationsParser.set_invalidation_push_handlerc                 C   r¹   rP   ©r¡   ©rT   r¡   rL   rL   rM   Úset_node_moving_push_handler�  r½   z4PushNotificationsParser.set_node_moving_push_handlerc                 C   r¹   rP   ©r¢   ©rT   r¢   rL   rL   rM   Úset_maintenance_push_handler„  r½   z4PushNotificationsParser.set_maintenance_push_handlerc                 C   r¹   rP   ©r£   ©rT   r£   rL   rL   rM   Ú"set_oss_cluster_maint_push_handler‡  r½   z:PushNotificationsParser.set_oss_cluster_maint_push_handler)rZ   r[   r\   rp   r   Ú__annotations__r    r	   r¡   r¢   r£   r¥   r¸   r¼   rÀ   rÃ   rÆ   rÉ   rL   rL   rL   rM   rž   /  s   
 ?rž   c                   @   s¶   e Zd ZU dZeed< dZee ed< dZeede	d f  ed< dZ
eede	d f  ed< dZeede	d f  ed< d	d
„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚAsyncPushNotificationsParserz<Protocol defining async RESP3-specific parsing functionalityrŸ   Nr    .r¡   r¢   r£   c                 Ã   rv   )z+Handle pubsub push responses asynchronouslyrQ   r¤   rL   rL   rM   r¥   ”  s   €z8AsyncPushNotificationsParser.handle_pubsub_push_responsec              
   Ë   s�  �|d }t |tƒr| ¡ }|tgt¢t‘t‘R vr"|  |¡I dH S zˆ|tkr3| jr3|  |¡I dH W S t |tƒr<| ¡ }|tkrV| j	rVt
| d }||ƒ}|  	|¡I dH W S |tv r„| jr„t
| d }|tkrl||ƒ}nt
| d }|||ƒ}|dur„|  |¡I dH W S |tkr¢| jr¥t
| d }||ƒ}|dur¨|  |¡I dH W S W dS W dS W dS  tyÇ } zt d |||¡¡ W Y d}~dS d}~ww )z$Handle push responses asynchronouslyr   Nr,   r¦   r§   r²   rL   rL   rM   r¸   ˜  sŠ   €
ÿþýüÿ
ÿþÿþ
ÿþ
ÿÿþøòùûÿ€ûz1AsyncPushNotificationsParser.handle_push_responsec                 C   ó
   || _ dS )z$Set the pubsub push handler functionNrº   r»   rL   rL   rM   r¼   ×  ó   
z4AsyncPushNotificationsParser.set_pubsub_push_handlerc                 C   rÌ   )z*Set the invalidation push handler functionNr¾   r¿   rL   rL   rM   rÀ   Û  rÍ   z:AsyncPushNotificationsParser.set_invalidation_push_handlerc                 C   r¹   rP   rÁ   rÂ   rL   rL   rM   rÃ   ß  r½   z9AsyncPushNotificationsParser.set_node_moving_push_handlerc                 C   r¹   rP   rÄ   rÅ   rL   rL   rM   rÆ   â  r½   z9AsyncPushNotificationsParser.set_maintenance_push_handlerc                 C   r¹   rP   rÇ   rÈ   rL   rL   rM   rÉ   å  r½   z?AsyncPushNotificationsParser.set_oss_cluster_maint_push_handler)rZ   r[   r\   rp   r   rÊ   r    r	   r¡   r   r¢   r£   r¥   r¸   r¼   rÀ   rÃ   rÆ   rÉ   rL   rL   rL   rM   rË   ‹  s   
 ?rË   c                       sv   e Zd ZdZejd Zdef‡ fdd„Zdd„ Zdd	„ Z	d
d„ Z
defdd„Zdedefdd„Zdefdd„Z‡  ZS )Ú_AsyncRESPBasez!Base class for async resp parsing)rf   rh   Ú_posÚ_chunksre   c                    s(   t ƒ  |¡ d | _d| _g | _d| _d S )Nó    r   )Úsuperrj   rf   rh   rÐ   rÏ   ri   ©Ú	__class__rL   rM   rj   î  s
   
z_AsyncRESPBase.__init__c                 C   s   d| _ | j ¡  d S )NrÑ   )rh   rÐ   ÚclearrS   rL   rL   rM   Ú_clearõ  s   z_AsyncRESPBase._clearc                 C   s4   |j | _| jdu rttƒ‚|j| _|  ¡  d| _dS )zCalled when the stream connectsNT)Ú_readerrs   r   r.   rf   rÖ   Ú
_connectedrW   rL   rL   rM   rY   ù  s   

z_AsyncRESPBase.on_connectc                 C   s
   d| _ dS )z"Called when the stream disconnectsFN)rØ   rS   rL   rL   rM   rU     rÍ   z_AsyncRESPBase.on_disconnectru   c              	   Ã   s~   �| j stdƒ‚| jrdS z'tdƒ4 I d H š | j ¡ W  d   ƒI d H  W S 1 I d H s-w   Y  W d S  ty>   Y dS w )NzBuffer is closed.Tr   F)rØ   ÚOSErrorrh   Úasync_timeoutrs   Úat_eofr   rS   rL   rL   rM   rw     s   €4ÿÿz#_AsyncRESPBase.can_read_destructiveÚlengthc              
   Ã   s¸   �|d }| j | }t| jƒ|kr| j| j |d … }n7| j| j d… }z| j |t|ƒ ¡I dH }W n tyD } zttƒ|‚d}~ww || dd… }| j 	|¡ |  j |7  _ |S )zŽ
        Read `length` bytes of data.  These are assumed to be followed
        by a '
' terminator which is subsequently discarded.
        r   Néþÿÿÿ)
rÏ   rD   rh   rs   Úreadexactlyr   r   r.   rÐ   r‚   )rT   rÜ   ÚwantÚendÚresultÚtailÚdatar°   rL   rL   rM   Ú_read  s    €

€ÿz_AsyncRESPBase._readc                 Ã   s”   �| j  d| j¡}|dkr| j | j|… }n'| j | jd… }| j ¡ I dH }| d¡s/ttƒ‚|| dd… }| j 	|¡ |  jt
|ƒd 7  _|S )zq
        read an unknown number of bytes up to the next '
'
        line separator, which is discarded.
        s   
r   NrÝ   r   )rh   ÚfindrÏ   rs   ÚreadlineÚendswithr   r.   rÐ   r‚   rD   )rT   Úfoundrá   râ   rã   rL   rL   rM   Ú	_readline%  s   €
z_AsyncRESPBase._readline)rZ   r[   r\   rp   rq   rz   r{   rj   rÖ   rY   rU   r|   rw   r¨   rä   ré   Ú__classcell__rL   rL   rÓ   rM   rÎ   é  s    
	rÎ   )\ÚloggingÚsysÚabcr   Úasyncior   r   r   Útypingr   r   r   r	   r
   r   Úredis.maint_notificationsr   r   r   r   r   r   r   r   Úredis.utilsr   Úversion_infoÚmajorÚminorr   rÚ   Ú
exceptionsr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   Úencodersr-   Úsocketr.   r/   r]   r_   r`   r^   ra   rb   Ú	getLoggerrZ   r¯   r0   rd   rq   r}   rª   r¬   Ú_MIGRATING_MESSAGEÚ_MIGRATED_MESSAGEÚ_FAILING_OVER_MESSAGEÚ_FAILED_OVER_MESSAGEr®   r­   r«   r�   rŽ   r“   r�   rŠ   r�   rF   ÚstrÚtupleÚtyperÊ   rž   rË   rÎ   rL   rL   rL   rM   Ú<module>   sœ   
  (
Pÿ
ú
ÿ
7#Gûþþþþþþþçþÿ"\^