U
    •uÄc´h ã                   @   s’  d dl mZmZmZmZmZmZmZ d dlZd dl	Z	d dl
mZ 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 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!m"Z" d dl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 dd„ Z:G dd„ deƒZ;eG dd„ de;ƒƒZ<G dd„ de<ƒZ=e >e<¡ G dd„ de?ƒZ@dS )é    )ÚUnionÚOptionalÚDictÚAnyÚClassVarÚListÚCallableN)Úreduce)Úwamp)ÚpublicÚIdGeneratorÚObservableMixin)Úuri)Úmessage)Útypes)Úrole)Ú	exception)ÚApplicationErrorÚProtocolErrorÚSerializationErrorÚTypeCheckError)ÚISessionÚIPayloadCodecÚIAuthenticatorÚ
ITransportÚIMessage)Ú	ChallengeÚSessionDetailsÚCloseDetailsÚEncodedPayloadÚSubscribeOptionsÚ
CallResultÚRegisterOptions)ÚPayloadExceededError)ÚPublicationÚSubscriptionÚHandlerÚRegistrationÚEndpointÚPublishRequestÚSubscribeRequestÚUnsubscribeRequestÚCallRequestÚInvocationRequestÚRegisterRequestÚUnregisterRequestc                 C   s   t  | ¡pt  | ¡S ©N)ÚinspectÚismethodÚ
isfunction)Úf© r5   úY/var/www/html/VPFITNESS/school/venv/lib/python3.8/site-packages/autobahn/wamp/protocol.pyÚis_method_or_function;   s    r7   c                   @   s6  e Zd ZdZdZdd„ Zeee dœdd„ƒZ	e
edœdd	„ƒZe
edœd
d„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeee dœdd„ƒZeeeeef  dœdd„ƒZd#eee dœdd„Zd$dd „Zd!d"„ ZdS )%ÚBaseSessionzi
    WAMP session base class.

    This class implements :class:`autobahn.wamp.interfaces.ISession`.
    Nc                 C   sŽ   t  ¡ | _| jdddddgd� d| _i | _tjttj	t
i| _d | _d | _d | _d | _d | _d | _d | _d | _tj| _d | _d | _tƒ | _d S )NÚjoinÚleaveÚreadyÚconnectÚ
disconnect)Zvalid_eventsF)ÚtxaioZmake_loggerÚlogZset_valid_eventsÚtraceback_appÚ_ecls_to_uri_patr   ÚINVALID_PAYLOADr   ÚPAYLOAD_SIZE_EXCEEDEDr#   Ú_uri_to_eclsÚ
_transportÚ_realmÚ_session_idÚ_authidÚ	_authroleÚ_authmethodÚ_authproviderÚ
_authextrar   ZDEFAULT_CLIENT_ROLESÚ_session_rolesÚ_session_detailsÚ_payload_codecr   Ú_request_id_gen©Úselfr5   r5   r6   Ú__init__G   s8    
ûÿ  þzBaseSession.__init__©Úreturnc                 C   s   | j S )zY
        Implements :func:`autobahn.wamp.interfaces.ITransportHandler.transport`
        )rE   rQ   r5   r5   r6   Ú	transportz   s    zBaseSession.transportc                 C   s   | j dk	o| j  ¡ S )zS
        Implements :func:`autobahn.wamp.interfaces.ISession.is_connected`
        N)rE   ZisOpenrQ   r5   r5   r6   Úis_connectedƒ   s    zBaseSession.is_connectedc                 C   s   | j dk	o|  ¡ S )zR
        Implements :func:`autobahn.wamp.interfaces.ISession.is_attached`
        N)rG   rW   rQ   r5   r5   r6   Úis_attachedŠ   s    zBaseSession.is_attachedc                 C   s   | j S )zV
        Implements :func:`autobahn.wamp.interfaces.ISession.session_details`
        )rN   rQ   r5   r5   r6   Úsession_details‘   s    zBaseSession.session_detailsc                 C   s   | j S r0   )rF   rQ   r5   r5   r6   Úrealm˜   s    zBaseSession.realmc                 C   s   | j S r0   )rG   rQ   r5   r5   r6   Ú
session_idœ   s    zBaseSession.session_idc                 C   s   | j S r0   )rH   rQ   r5   r5   r6   Úauthid    s    zBaseSession.authidc                 C   s   | j S r0   )rI   rQ   r5   r5   r6   Úauthrole¤   s    zBaseSession.authrolec                 C   s   | j S r0   )rJ   rQ   r5   r5   r6   Ú
authmethod¨   s    zBaseSession.authmethodc                 C   s   | j S r0   )rK   rQ   r5   r5   r6   Úauthprovider¬   s    zBaseSession.authproviderc                 C   s   | j S r0   )rL   rQ   r5   r5   r6   Ú	authextra°   s    zBaseSession.authextra)r   Úerrorc                 C   sx   |dkr>t |dƒr4|j| j|< || j|jd  ¡ < qttdƒ‚n6t |dƒslt |tjj¡g| j|< || j|< ntdƒ‚dS )zM
        Implements :func:`autobahn.wamp.interfaces.ISession.define`
        NÚ	_wampurisr   zNcannot define WAMP exception from class with no decoration ("_wampuris" unset)z\cannot define WAMP exception: error URI is explicit, but class is decorated ("_wampuris" set)Úhasattrrb   rA   rD   r   ÚRuntimeErrorÚPatternZURI_TARGET_HANDLER)rR   r   ra   r5   r5   r6   Údefine´   s    


zBaseSession.definec              	   C   sê   d}t |dƒrt|jƒ}d}t |dƒr,|j}|rF|r>||d< nd|i}t|tjƒrnt|jƒt	krf|jn|j}n$|j
| jkrŽ| j|j
 d j}nd}d}	| jr®| j d|||¡}	|	rÔtj||||	j|	j|	j|	jd�}
nt |||||¡}
|
S )	aÿ  
        Create a WAMP error message from an exception.

        :param request_type: The request type this WAMP error message is for.
        :type request_type: int

        :param request: The request ID this WAMP error message is for.
        :type request: int

        :param exc: The exception.
        :type exc: Instance of :class:`Exception` or subclass thereof.

        :param tb: Optional traceback. If present, it'll be included with the WAMP error message.
        :type tb: list or None
        NÚargsÚkwargsÚ	tracebackr   zwamp.error.runtime_errorF©ÚpayloadÚenc_algoÚenc_keyÚenc_serializer)rc   Úlistrg   rh   Ú
isinstancer   r   Útypera   ÚstrÚ	__class__rA   Ú_urirO   Úencoder   ÚErrorrk   rl   rm   rn   )rR   Úrequest_typeÚrequestÚexcÚtbrl   rg   rh   ra   Úencoded_payloadÚmsgr5   r5   r6   Ú_message_from_exceptionÅ   sD    



úüz#BaseSession._message_from_exceptionc           	   
   C   sr  d}d}|j rô| js8d}| j |¡ ttj||j d�}n¼z6t|j|j |j|j	ƒ}| j 
d|j|¡\}|_|_W nJ tk
r¸ } z,| jjd|d� ttjd |¡|j d�}W 5 d}~X Y n<X |j|krô| jjd||jd	� ttjd
 ||j¡|j d�}|rü|S |j| jk�rœ| j|j }zL|j�rF|j�r8||j|jŽ}n|f |jŽ}n|j�rZ||jŽ }n|ƒ }W n8 tk
�rš   z|  t ¡ d¡ W n   Y nX Y nX |�s
|j�rà|j�rÌtj|jf|jž|jŽ}ntj|jf|jŽ}n*|j�rþtj|jf|jžŽ }nt |j¡}t|dƒ�r|j |_ t|dƒ�r2|j|_t|dƒ�rF|j|_t|dƒ�rZ|j|_t|dƒ�rn|j|_|S )zÀ
        Create a user (or generic) exception from a WAMP error message.

        :param msg: A WAMP error message.
        :type msg: instance of :class:`autobahn.wamp.message.Error`
        Nú5received encoded payload, but no payload codec active©rl   Tú.failed to decrypt application payload 1: {err}©Úerrú+failed to decrypt application payload 1: {}zZURI within encrypted payload ('{decrypted_error}') does not match the envelope ('{error}'))Údecrypted_errorra   úFURI within encrypted payload ('{}') does not match the envelope ('{}')zWhile re-constructing exceptionrl   ÚcalleeÚcallee_authidÚcallee_authroleÚforward_for)rl   rO   r?   Úwarnr   ÚENC_NO_PAYLOAD_CODECr   rk   rn   rm   Údecodera   rg   rh   Ú	ExceptionÚENC_DECRYPT_ERRORÚformatÚENC_TRUSTED_URI_MISMATCHrD   ÚonUserErrorr>   Úcreate_failurer   rc   r†   r‡   rˆ   r‰   )	rR   r|   ry   Úenc_errÚlog_msgr{   r„   ÚeZeclsr5   r5   r6   Ú_exception_from_message   s†     ý
ýý
þz#BaseSession._exception_from_message)N)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r?   rS   Úpropertyr   r   rV   r   ÚboolrW   rX   r   rY   rr   rZ   Úintr[   r\   r]   r^   r_   r   r   r`   r�   rf   r}   r–   r5   r5   r5   r6   r8   ?   s8   3
;r8   c                   @   sV  e Zd ZdZdEeej dœdd„Zeejdœdd„ƒZ	e
ee d	œd
d„ƒZe
ee dœdd„ƒZe
edœdd„ƒZe
dd„ ƒZe
dFeeee  ee ee eeeef  ee ee ee dœdd„ƒZe
dd„ ƒZe
dd„ ƒZdd„ Zdd„ Zedœdd „Ze
d!d"„ ƒZe
eed#œd$d%„ƒZ e
e!d&œd'd(„ƒZ"e
e#j$ee d)œd*d+„ƒZ%d,d-„ Z&e
e'd&œd.d/„ƒZ(e
dGee ee d0œd1d2„ƒZ)e
d3d4„ ƒZ*e
eee+ d5œd6d7„ƒZ,e
dHe-e.ef ee ee/ ee e-e0ee0 f d8œd9d:„ƒZ1d;d<„ Z2e
ee-ee3f d=œd>d?„ƒZ4e
dIe-e.ef ee ee5 ee ee e-e6ee6 f d@œdAdB„ƒZ7dCdD„ Z8dS )JÚApplicationSessionzë
    WAMP application session for applications (networking framework agnostic parts).

    Implements (partially):

        * :class:`autobahn.wamp.interfaces.ITransportHandler`
        * :class:`autobahn.wamp.interfaces.ISession`
    N)Úconfigc                 C   sh   t  | ¡ |ptjdd�| _d| _d| _d| _i | _i | _	i | _
i | _i | _i | _i | _i | _i | _dS )zF
        Implements :func:`autobahn.wamp.interfaces.ISession`
        Úrealm1©rZ   FN)r8   rS   r   ÚComponentConfigÚ_configÚ_goodbye_sentZ_transport_is_closingrO   Ú_publish_reqsÚ_subscribe_reqsÚ_unsubscribe_reqsÚ
_call_reqsÚ_register_reqsÚ_unregister_reqsÚ_subscriptionsÚ_registrationsÚ_invocations©rR   rŸ   r5   r5   r6   rS   p  s    
zApplicationSession.__init__rT   c                 C   s   | j S r0   )r£   rQ   r5   r5   r6   rŸ   �  s    zApplicationSession.config)Úpayload_codecc                 C   s
   || _ dS )zX
        Implements :func:`autobahn.wamp.interfaces.ISession.set_payload_codec`
        N©rO   )rR   r¯   r5   r5   r6   Úset_payload_codec“  s    z$ApplicationSession.set_payload_codecc                 C   s   | j S )zX
        Implements :func:`autobahn.wamp.interfaces.ISession.get_payload_codec`
        r°   rQ   r5   r5   r6   Úget_payload_codecš  s    z$ApplicationSession.get_payload_codec)rV   c                    s`   ˆ j jdˆ j|d� |ˆ _ˆ  dˆ |¡}t |d‡ fdd„¡ t |‡ fdd„‡ fdd„¡ dS )	zV
        Implements :func:`autobahn.wamp.interfaces.ITransportHandler.onOpen`
        z{func}(transport={transport}))ÚfuncrV   r<   Nc                    s   ˆ   | d¡S )NzWhile notifying 'connect'©Ú_swallow_error©ÚfailrQ   r5   r6   Ú<lambda>¯  ó    z+ApplicationSession.onOpen.<locals>.<lambda>c                    s   t  ˆ j¡S r0   )r>   Ú	as_futureÚ	onConnect©Ú_rQ   r5   r6   r¸   ³  r¹   c                    s   ˆ   | d¡S )NzWhile calling 'onConnect'r´   r¶   rQ   r5   r6   r¸   ´  r¹   )r?   ÚdebugÚonOpenrE   Úfirer>   Úadd_callbacks)rR   rV   Údr5   rQ   r6   r¿   ¡  s     
þ

ýzApplicationSession.onOpenc                 C   s$   | j jd| jd� |  | jj¡ dS )zP
        Implements :func:`autobahn.wamp.interfaces.ISession.onConnect`
        z{func}()©r³   N)r?   r¾   r»   r9   rŸ   rZ   rQ   r5   r5   r6   r»   ·  s    zApplicationSession.onConnect)rZ   Úauthmethodsr\   r]   r`   Ú	resumableÚresume_sessionÚresume_tokenc	           
      C   sV   | j rtdƒ‚| jstdƒ‚|| _d| _tj|| j|||||||d�	}	| j |	¡ dS )zK
        Implements :func:`autobahn.wamp.interfaces.ISession.join`
        zsession already joinedzno transport set for sessionF)	rZ   ÚrolesrÄ   r\   r]   r`   rÅ   rÆ   rÇ   N)	rG   r�   rE   rF   r¤   r   ZHellorM   Úsend)
rR   rZ   rÄ   r\   r]   r`   rÅ   rÆ   rÇ   r|   r5   r5   r6   r9   ¿  s"    ø	zApplicationSession.joinc                 C   s   | j r| j  ¡  dS )zQ
        Implements :func:`autobahn.wamp.interfaces.ISession.disconnect`
        N)rE   ÚcloserQ   r5   r5   r6   r=   å  s    zApplicationSession.disconnectc                 C   sX   t |dƒr6t|jtjƒr6| jjd| jj|j 	¡ d� n| jj
d| jj|t |¡d� dS )zR
        Implements :func:`autobahn.wamp.interfaces.ISession.onUserError`
        Úvaluez{klass}.onUserError(): "{msg}")Úklassr|   z*{klass}.onUserError(): "{msg}"
{traceback})rÌ   r|   ri   N)rc   rp   rË   r   r   r?   rŠ   rs   r—   Úerror_messagera   r>   Úfailure_format_traceback©rR   r·   r|   r5   r5   r6   r‘   í  s    þüzApplicationSession.onUserErrorc              	   C   sD   z|   ||¡ W n. tk
r>   | jjdt t ¡ ¡d� Y nX dS )a˜  
        This is an internal generic error-handler for errors encountered
        when calling down to on*() handlers that can reasonably be
        expected to be overridden in user code.

        Note that it *cancels* the error, so use with care!

        Specifically, this should *never* be added to the errback
        chain for a Deferred/coroutine that will make it out to user
        code.
        zInternal error: {tb})rz   N)r‘   r�   r?   ra   r>   rÎ   r’   rÏ   r5   r5   r6   rµ   þ  s    þz!ApplicationSession._swallow_errorc                    s   ‡ fdd„}|S )zŸ
        Does parameter type checking and validation against type hints
        and appropriately tells the user code and the caller (through router).
        c               
   Ÿ   sÚ   t jˆ f| ž|Ž}g }ˆ j ¡ D ]Ž\}}||kr t|dd ƒtkr€dd„ |jD ƒ}t|| |jƒs®| d 	||t
|| ƒj¡¡ q t|| |ƒs | d 	||jt
|| ƒj¡¡ q |rÂtd |¡ƒ‚tjˆ f| ž|ŽI d H S )NÚ
__origin__c                 S   s   g | ]
}|j ‘qS r5   )r—   )Ú.0Úargr5   r5   r6   Ú
<listcomp>!  s     zFApplicationSession.type_check.<locals>._type_check.<locals>.<listcomp>z'{}' expected types={} got={}z'{}' expected type={} got={}z, )r1   ÚgetcallargsÚ__annotations__ÚitemsÚgetattrr   Ú__args__rp   Úappendr�   rq   r—   r   r9   r>   rº   )rg   rh   Ú	argumentsÚresponseÚnameÚkindZexpected_typesrÃ   r5   r6   Ú_type_check  s&    ÿÿÿz2ApplicationSession.type_check.<locals>._type_checkr5   )rR   r³   rÞ   r5   rÃ   r6   Ú
type_check  s    zApplicationSession.type_check)r|   c           "         sê  ˆj dk�r
tˆtjƒrPt ˆjˆ¡}‡‡fdd„}‡fdd„}t |||¡ n¶tˆtjƒr¤t	 
ˆjˆj¡‰ t ˆjˆ ¡}‡ ‡fdd„}‡fdd„}t |||¡ nbtˆtjƒröt	 ˆjˆj¡}t ˆj|¡}‡fd	d„}‡fd
d„}t |||¡ ntd ˆj¡ƒ‚�nÜtˆtjƒ�r†ˆj�s4t ¡ }ˆj |¡ dˆ_ t	 
ˆjˆj¡‰ t ˆjˆ ¡}‡ ‡fdd„}‡‡fdd„}t |||¡ �n`tˆtjƒ�rXˆjˆjk�rDˆjˆj D �]�}|j‰ˆj�pÆ|j}	ˆj�r‚ˆj�sðˆjj dˆjd�  dS z4t!ˆj"ˆjˆj#ˆj$ƒ}
ˆj %d|	|
¡\}ˆ_&ˆ_'W n@ t(k
�rd } z ˆjj d|ˆjd� W Y ¢ dS d}~X Y nX |	|k�r‚ˆj  d¡  dS ˆj)�r’ˆj)fnt*ƒ }ˆj&�r®|t*ˆj&ƒ }ˆj'�r¼ˆj'nt+ƒ }ˆj,�rþt	j-|ˆj.ˆj/ˆj0ˆj1|	ˆj2ˆj3ˆjˆj4d�
|ˆj,< ‡‡fdd„}‡‡‡fdd„}tjˆj5f|ž|Ž}t |||¡ �q®ntd ˆj¡ƒ‚�
nŽtˆtj6ƒ�rÖˆj7ˆj8k�rÂˆj8 9ˆj7¡}t :|j;¡�r¢t <|j;¡�r¢dS t=ˆj.|j>d�}t ?|j;|¡ ntd ˆj7¡ƒ‚�
ntˆtj@ƒ�r„ˆj7ˆjAk�rpˆjA 9ˆj7¡}t :|j;¡�r t <|j;¡�r dS ˆjˆjk�r:g ˆjˆj< tBˆj|jˆ|jƒ}ˆjˆj  C|¡ t ?|j;|¡ ntd ˆj7¡ƒ‚�	nbtˆtjDƒ�r$ˆj7ˆjEk�rˆjE 9ˆj7¡}t :|j;¡�rÎt <|j;¡�rÎdS |jFˆjk�r ˆj|jF D ]}d|_G�qèˆj|jF= t ?|j;d¡ ntd ˆj7¡ƒ‚�nÂtˆtjHƒ�rˆj7ˆjIk�rˆjIˆj7 }|jJ‰d}ˆj�r0ˆj�s„d}ˆj  |¡ tKtKjL|ƒ}n¬z4t!ˆj"ˆjˆj#ˆj$ƒ}
ˆj %dˆ|
¡\}ˆ_&ˆ_'W nF t(k
�rþ } z&ˆjj d |d!� tKtKjMd" |¡ƒ}W 5 d}~X Y n2X ˆ|k�r0ˆjj d#|ˆd$� tKtKjNd% |ˆ¡ƒ}ˆjO�rì|jPjQ�r|�rVˆ R|d&¡ n’ˆj'�pbt+ƒ }ˆj&�ppt*ƒ }‡fd'd„}|jP�rÄ|jPjS�rÄt |jPjQt	jTˆj&ˆjUˆjVˆjWˆj4d(œˆj'—Ž¡}ntj|jPjQf|ž|Ž}t |d|¡ �qˆjIˆj7= |j;}t :|¡�rt <|¡�rdS |�r,t X||¡ nÖˆj'�sF|jP�r°|jPjS�r°ˆj'�pPi }ˆj&�r€t	jTˆj&ˆjUˆjVˆjWˆj4d(œ|—Ž}n"t	jTf ˆjUˆjVˆjWˆj4d(œ|—Ž}t ?||¡ nRˆj&�rötYˆj&ƒd)k�rât	jTˆj&Ž }t ?||¡ nt ?|ˆj&d ¡ nt ?|d¡ ntd* ˆj7¡ƒ‚�nÎtˆtjZƒ�
r‚ˆj7ˆj[k�rHtd+ ˆj7¡ƒ‚�qæˆj\ˆj]k�rjtd, ˆj\¡ƒ‚�qæˆj]ˆj\ ‰ˆj^}ˆjJ�pˆˆjJ‰d}ˆj�	rhˆj�s¼d-}ˆj  |¡ tKtKjL|ƒ}n¬z4t!ˆj"ˆjˆj#ˆj$ƒ}
ˆj %dˆ|
¡\}ˆ_&ˆ_'W nF t(k
�	r6 } z&ˆjj d.|d!� tKtKjMd/ |¡ƒ}W 5 d}~X Y n2X ˆ|k�	rhˆjj d0|ˆd$� tKtKjNd1 |ˆ¡ƒ}|�	r�ˆ _tjZj`ˆj7|¡}ˆj |¡ nî|j)dk	�	r¦|j)f}nt*ƒ }ˆj&�	rÂ|t*ˆj&ƒ }ˆj'�	rÐˆj'nt+ƒ }|j,�
r&ˆja�	rø‡‡‡fd2d3„}nd}t	jbˆ|ˆjcˆjdˆjeˆˆj2ˆjd4�||j,< tj|j5f|ž|Ž}‡‡‡‡fd5d„}‡‡‡fd6d„}tfˆj7|ƒˆj[ˆj7< t |||¡ �ndtˆtjgƒ�
rÎˆj7ˆj[k�
r²ˆjjhd7ˆj7d8� nˆj[ˆj7 } t i| j;¡ �ntˆtjjƒ�r|ˆj7ˆjkk�rhˆjk 9ˆj7¡}t :|j;¡�rt <|j;¡�rdS ˆj\ˆj]k�rHtlˆˆj\|jJ|j^ƒ‰ˆˆj]ˆj\< ntd9 ˆj\¡ƒ‚t ?|j;ˆ¡ ntd: ˆj7¡ƒ‚�njtˆtjmƒ�rjˆj7dk�ræzˆj]ˆj\ }!W n& tnk
�rÌ   td; ˆj\¡ƒ‚Y nX ˆjjhd<|!jJˆj\d=� n€ˆj7ˆjok�rVˆjo 9ˆj7¡}t :|j;¡�r"t <|j;¡�r"dS |jpˆj]k�rHdˆj]|jp _Gˆj]|jp= t ?|j;¡ ntd> ˆj7¡ƒ‚�n|tˆtjqƒ�rÖd}ˆjrtjsj`k�r¬ˆj7ˆjIk�r¬ˆjI 9ˆj7¡j;}nîˆjrtjtj`k�rÜˆj7ˆj8k�rÜˆj8 9ˆj7¡j;}n¾ˆjrtjuj`k�rˆj7ˆjAk�rˆjA 9ˆj7¡j;}nŽˆjrtjvj`k�r<ˆj7ˆjEk�r<ˆjE 9ˆj7¡j;}n^ˆjrtjwj`k�rlˆj7ˆjkk�rlˆjk 9ˆj7¡j;}n.ˆjrtjxj`k�ršˆj7ˆjok�ršˆjo 9ˆj7¡j;}|�rÀt <|¡�sÔt X|ˆ yˆ¡¡ ntd? ˆjrˆj7¡ƒ‚ntd@ ˆj¡ƒ‚dS )AzY
        Implements :func:`autobahn.wamp.interfaces.ITransportHandler.onMessage`
        Nc                    s<  | d k	r:ˆj jd| d� t dd | ¡¡}ˆj |¡ d S ˆ jrHˆ jˆ_ˆ j	ˆ_
ˆ jˆ_ˆ jˆ_ˆ jˆ_ˆ jˆ_ˆ jˆ_ˆ jˆ_tˆjˆj
ˆjˆjˆjˆjˆ jˆjjjˆjjddd d�ˆ_ˆ dˆˆj¡}t |d ‡fdd	„¡ t |‡fd
d	„d ¡ t |d ‡fdd	„¡ t |‡fdd	„d ¡ t |d ‡fdd	„¡ d S )Nz"Session denied by onWelcome: {res})Úresúwamp.error.cannot_authenticateú{0}F)rZ   Úsessionr\   r]   r^   r_   r`   Z
serializerrV   ZresumedrÅ   rÇ   r9   c                    s   ˆ   | d¡S )NzWhile notifying 'join'r´   ©r•   rQ   r5   r6   r¸   n  r¹   z?ApplicationSession.onMessage.<locals>.success.<locals>.<lambda>c                    s   t  ˆ jˆ j¡S r0   )r>   rº   ÚonJoinrN   r¼   rQ   r5   r6   r¸   s  r¹   c                    s   ˆ   | d¡S )NzWhile firing onJoinr´   rä   rQ   r5   r6   r¸   y  r¹   c                    s   ˆ   dˆ ¡S )Nr;   ©rÀ   r¼   rQ   r5   r6   r¸   ~  r¹   c                    s   ˆ   | d¡S )NzWhile notifying 'ready'r´   rä   rQ   r5   r6   r¸   „  r¹   )r?   r¾   r   ÚAbortr�   rE   rÉ   rZ   rF   rã   rG   r\   rH   r]   rI   r^   rJ   r_   rK   r`   rL   rÈ   Ú_router_rolesr   Z_serializerZSERIALIZER_IDZtransport_detailsrN   rÀ   r>   rÁ   )rà   ÚreplyrÂ   ©r|   rR   r5   r6   ÚsuccessA  sr     ÿó 
þ
ý 
þ
ý 
þz-ApplicationSession.onMessage.<locals>.successc                    s$   t  dd¡}ˆ j |¡ ˆ  | d¡S )Nrá   zError calling onWelcome handlerzWhile firing onWelcome)r   rç   rE   rÉ   rµ   )r•   ré   rQ   r5   r6   ra   ‡  s     ÿz+ApplicationSession.onMessage.<locals>.errorc                    s8   ˆ  dˆˆ¡}‡ fdd„}‡fdd„}t |||¡ |S )Nr:   c                    s   ˆ S r0   r5   r¼   ©rÒ   r5   r6   Ú
return_arg˜  s    zAApplicationSession.onMessage.<locals>.success.<locals>.return_argc                    s   ˆ   | d¡S )NzWhile firing 'leave' eventr´   rä   rQ   r5   r6   Ú_error›  s    z=ApplicationSession.onMessage.<locals>.success.<locals>._error)rÀ   r>   rÁ   )rÒ   rÂ   rí   rî   ©ÚdetailsrR   rì   r6   rë   ”  s
    c                    s   ˆ   | d¡S ©NzWhile firing onLeaver´   rä   rQ   r5   r6   rî      s    z,ApplicationSession.onMessage.<locals>._errorc                    s^   | d krt dƒ‚t| ƒtkr&|  d¡} t| ƒtkrDt d t| ƒ¡ƒ‚t | ¡}ˆ j 	|¡ d S )Nz4onChallenge user callback did not return a signatureÚutf8z"signature must be unicode (was {}))
r�   rq   ÚbytesrŒ   rr   r�   r   ZAuthenticaterE   rÉ   )Ú	signatureré   rQ   r5   r6   rë   ©  s    

c                    sv   ˆ  | d¡ t dd | j¡¡}ˆj |¡ t |j	|j¡‰ t
 ˆjˆ ¡}‡ ‡fdd„}‡fdd„}t
 |||¡ |S )NzAuthentication failedrá   râ   c                    s   ˆ  dˆˆ ¡ | S ©Nr:   ræ   rì   rï   r5   r6   rë   »  s    z<ApplicationSession.onMessage.<locals>.error.<locals>.successc                    s   ˆ   | d¡S rñ   r´   rä   rQ   r5   r6   rî   À  s    z;ApplicationSession.onMessage.<locals>.error.<locals>._error)r‘   r   rç   r�   rË   rE   rÉ   r   r   Úreasonr>   rº   ÚonLeaverÁ   )r‚   ré   rÂ   rë   rî   rQ   ©rð   r6   ra   ³  s    z8Received {0} message, and session is not yet establishedc                    s   ˆ  dˆˆ ¡ | S rõ   ræ   rì   rï   r5   r6   rë   Ú  s    c                    s   d  ˆ jˆ j¡}ˆ | |¡S )Nz7While firing onLeave for reason "{0}" and message "{1}")r�   rö   r   rµ   ©r•   Úerrmsgrê   r5   r6   rî   ß  s    zjreceived encoded payload with enc_algo={enc_algo}, but no payload codec active - ignoring encoded payload!r   FzNfailed to decode application payload encoded with enc_algo={enc_algo}: {error})ra   rl   z-envelope topic URI does not match encoded one)Ú	publisherÚpublisher_authidÚpublisher_authroleÚtopicÚtransaction_hashÚretainedrl   r‰   c                    sB   ˆ j r>ˆjd jr>ˆjr2t ˆ j¡}ˆj |¡ nˆj 	d¡ d S )NZbrokerz}successfully processed event with acknowledged delivery, but could not send ACK, since the transport was lost in the meantime)
Zx_acknowledged_deliveryrè   Zx_acknowledged_event_deliveryrE   r   ZEventReceivedÚpublicationrÉ   r?   rŠ   )r½   rÛ   rê   r5   r6   Ú_success  s
    z.ApplicationSession.onMessage.<locals>._successc                    s   d  ˆ jˆj¡}ˆ | |¡S )Nz&While firing {0} subscribed under {1}.)r�   ÚfnÚsubscriptionrµ   rù   )Úhandlerr|   rR   r5   r6   rî     s
     ÿz5EVENT received for non-subscribed subscription ID {0}©Úwas_encryptedz1PUBLISHED received for non-pending request ID {0}z2SUBSCRIBED received for non-pending request ID {0}r   z4UNSUBSCRIBED received for non-pending request ID {0}r~   Tr€   r�   rƒ   zXURI within encrypted payload ('{decrypted_proc}') does not match the envelope ('{proc}'))Údecrypted_procÚprocr…   zLcould not deliver progressive call result, because payload decryption failedc                    s   ˆ   | d¡ d S )NzWhile firing on_progress)r‘   r¶   rQ   r5   r6   rî   �  s    )r†   r‡   rˆ   r‰   é   z.RESULT received for non-pending request ID {0}z6INVOCATION received for request ID {0} already invokedz:INVOCATION received for non-registered registration ID {0}z<received encrypted INVOCATION payload, but no keyring activez+failed to decrypt INVOCATION payload: {err}z(failed to decrypt INVOCATION payload: {}zcURI within encrypted INVOCATION payload ('{decrypted_proc}') does not match the envelope ('{proc}')zQURI within encrypted INVOCATION payload ('{}') does not match the envelope ('{}')c                     s¨   | d kst | ƒttfkst‚|d ks4t |ƒtks4t‚d }ˆ jr^ˆjsLtdƒ‚ˆj dˆ| |¡}|r„t	j
ˆ j|jd|j|j|jd�}nt	j
ˆ j| |dd�}ˆj |¡ d S )Nú7trying to send encrypted payload, but no keyring activeFT)rk   Úprogressrl   rm   rn   )rg   rh   r  )rq   ro   ÚtupleÚAssertionErrorÚdictrl   rO   r�   ru   r   ÚYieldrx   rk   rm   rn   rE   rÉ   )rg   rh   r{   Zprogress_msg)r|   r	  rR   r5   r6   r    s*    ûýz.ApplicationSession.onMessage.<locals>.progress)r  ÚcallerÚcaller_authidÚcaller_authroleÚ	procedurerÿ   rl   c                    s:  ˆj ˆ j= d }ˆ jršˆjs,d}ˆj |¡ nnz:t| tjƒrRˆj 	dˆ| j
| j¡}nˆj 	dˆ| g¡}W n2 tk
r˜ } zˆjjd|d� W 5 d }~X Y nX |rút| tjƒrÚtjˆ j|j|j|j|j| j| j| j| jd�	}ntjˆ j|j|j|j|jd�}nHt| tjƒ�r0tjˆ j| j
| j| j| j| j| jd�}ntjˆ j| gd�}ˆjd k�rjˆj d	 ˆjˆ j¡¡ d S zˆj |¡ W nº tk
�rØ } z>tjtjjˆ jtj d
 |j!|j"ˆj|¡gd�}ˆj |¡ W 5 d }~X Y n^ t#k
�r4 } z>tjtjjˆ jtj$d |j!|j"ˆj|¡gd�}ˆj |¡ W 5 d }~X Y nX d S )Nr  Fz,failed to encrypt application payload: {err}r�   )rk   rl   rm   rn   r†   r‡   rˆ   r‰   rj   )rg   rh   r†   r‡   rˆ   r‰   ©rg   zCSkipping result of "{}", request {} because transport disconnected.zasuccess return value (args={}, kwargs={}) from invoked procedure "{}" could not be serialized: {}zfsuccess return value (args={}, kwargs={}) from invoked procedure "{}" exceeds transport size limit: {})%r­   rx   rl   rO   r?   rŠ   rp   r   r!   ru   ÚresultsZ	kwresultsr�   r   r  rk   rm   rn   r†   r‡   rˆ   r‰   rE   r¾   r�   r  rÉ   r   rv   Ú
InvocationÚMESSAGE_TYPEr   rB   rg   rh   r#   rC   )rà   r{   r”   r•   ré   Zerror_reply)r|   r	  ÚregistrationrR   r5   r6   rë   8  sˆ    
þø
üúÿýÿýÿc                    s   ˆj ˆ j= t | ¡}zˆ | |¡ W n   Y nX d }ˆjrFt | ¡}ˆ tj	j
ˆ j| j|ˆ j¡}zˆj |¡ W n¨ tk
rÆ } z6tjtj	j
ˆ jtjd ˆj|¡gd�}ˆj |¡ W 5 d }~X Y nV tk
�r } z6tjtj	j
ˆ jtjd ˆj|¡gd�}ˆj |¡ W 5 d }~X Y nX d S )NzLerror return value from invoked procedure "{0}" could not be serialized: {1}r  zSsuccess return value from invoked procedure "{0}" exceeds transport size limit: {1})r­   rx   r>   Zfailure_messager‘   r@   rÎ   r}   r   r  r  rË   rl   rE   rÉ   r   rv   r   rB   r�   r  r#   rC   )r‚   rú   Zformatted_tbré   r•   )r|   r  rR   r5   r6   ra   ‚  s:    


ûÿÿz7INTERRUPT received for non-pending invocation {request}©rx   z<REGISTERED received for already existing registration ID {0}z2REGISTERED received for non-pending request ID {0}z:UNREGISTERED received for non-existant registration ID {0}z3Router unregistered procedure '{proc}' with ID {id})r	  Úidz4UNREGISTERED received for non-pending request ID {0}z^WampAppSession.onMessage(): ERROR received for non-pending request_type {0} and request ID {1}zUnexpected message {0})zrG   rp   r   ÚWelcomer>   rº   Ú	onWelcomerÁ   rç   r   r   rö   r÷   r   ÚmethodÚextraÚonChallenger   r�   rs   ÚGoodbyer¤   rE   rÉ   ÚEventr  r«   r  rþ   rl   rO   r?   rŠ   r   rk   rn   rm   rŒ   rg   rh   r�   Úobjr  r  Údetails_argZEventDetailsr  rû   rü   rý   rÿ   r   r‰   r  Z	Publishedrx   r¥   ÚpopZ	is_futureÚon_replyÚ	is_calledr$   r  ÚresolveZ
Subscribedr¦   r%   rÙ   ZUnsubscribedr§   Zsubscription_idÚactiveZResultr¨   r  r   r‹   rŽ   r�   r  ÚoptionsZon_progressr‘   rð   r!   r†   r‡   rˆ   ÚrejectÚlenr  r­   r  r¬   Úendpointr}   r  Zreceive_progressZCallDetailsr  r  r  r-   Z	Interruptr¾   ÚcancelZ
Registeredr©   r'   ZUnregisteredÚKeyErrorrª   Zregistration_idrv   rw   ÚCallÚPublishÚ	SubscribeÚUnsubscribeÚRegisterÚ
Unregisterr–   )"rR   r|   rÂ   rë   ra   rî   Ú	challengeré   r  rþ   r{   Zdecoded_topicr•   Zinvoke_argsZinvoke_kwargsr  ÚfutureZpublish_requestr  rx   Zcall_requestr“   r”   r  Úkwrg   Zprog_dr&  rh   rà   r-  r  ZinvokedÚregr5   )rð   r  r|   r	  r  rR   r6   Ú	onMessage/  sT   F

4


þþ
ý
þ

üûÿÿþ
üû
ýüþþ
ü
þ
ù	J'ÿÿ
ý
zApplicationSession.onMessagec                    sš   dˆ_ ˆjrbtjtjjd ˆj¡d�‰ t ˆjˆ ¡}‡ ‡fdd„}‡fdd„}t 	|||¡ dˆ_t ˆj
¡}‡‡fdd„}‡fd	d„}t 	|||¡ dS )
zW
        Implements :func:`autobahn.wamp.interfaces.ITransportHandler.onClose`
        Nz=WAMP transport was lost without closing the session {} before©rö   r   c                    s   ˆ  dˆˆ ¡ | S rõ   ræ   rì   rï   r5   r6   rë   (  s    z+ApplicationSession.onClose.<locals>.successc                    s   ˆ   | d¡S rñ   r´   rä   rQ   r5   r6   rî   -  s    z*ApplicationSession.onClose.<locals>._errorc                    s   ˆ j dˆ ˆd�S )Nr=   )Z	was_cleanræ   rì   )rR   ÚwasCleanr5   r6   rë   5  s    c                    s   ˆ   | d¡S )NzWhile firing onDisconnectr´   rä   rQ   r5   r6   rî   9  s    )rE   rG   r   r   ZREASON_TRANSPORT_LOSTr�   r>   rº   r÷   rÁ   ÚonDisconnect)rR   r<  rÂ   rë   rî   r5   )rð   rR   r<  r6   ÚonClose  s    
þzApplicationSession.onClose)r6  rU   c                 C   s   t dƒ‚dS )zR
        Implements :func:`autobahn.wamp.interfaces.ISession.onChallenge`
        zBreceived authentication challenge, but onChallenge not implementedN)rd   )rR   r6  r5   r5   r6   r   =  s    	zApplicationSession.onChallengerø   c                 C   s   dS )zM
        Implements :meth:`autobahn.wamp.interfaces.ISession.onJoin`
        Nr5   ©rR   rð   r5   r5   r6   rå   H  s    zApplicationSession.onJoin)ÚwelcomerU   c                 C   s   dS )zP
        Implements :meth:`autobahn.wamp.interfaces.ISession.onWelcome`
        Nr5   )rR   r@  r5   r5   r6   r  N  s    zApplicationSession.onWelcomec                    sÄ   t  d¡}| j| j| j| j| j| jg}g }|D ]}| | 	¡ ¡ | 
¡  q.|rb| jjdt|ƒd� |D ]X‰ | jjdˆ jˆ jˆ jjd� t  ˆ j¡s t  ˆ j|¡ t  |‡ fdd„‡ fdd„¡ qf|S )zB
        Errback any still outstanding requests with exc.
        Nz'Cancelling {count} outstanding requests)Úcountzncleaning up outstanding {request_type} request {request_id}, firing errback on user handler {request_on_reply})Zrequest_on_replyÚ
request_idrw   c                    s   ˆ j S r0   )r&  r¼   r  r5   r6   r¸   w  r¹   zBApplicationSession._errback_outstanding_requests.<locals>.<lambda>)r>   Úcreate_future_successr¥   r¦   r§   r¨   r©   rª   ÚextendÚvaluesÚclearr?   Úinfor,  r¾   r&  rB  rs   r—   r'  r+  rÁ   )rR   ry   rÂ   Zall_requestsZoutstandingZrequestsr5   r  r6   Ú_errback_outstanding_requestsT  s8    
ú
þû z0ApplicationSession._errback_outstanding_requestsc                    sX   |j tjkr"ˆ jjd|j |jd� t|j |jƒ}ˆ  |¡}‡ fdd„}t 	|||¡ |S )zN
        Implements :meth:`autobahn.wamp.interfaces.ISession.onLeave`
        z/session closed with reason {reason} [{message}]r;  c                    s   ˆ j rˆ  ¡  d S r0   )rE   r=   r¼   rQ   r5   r6   r=   †  s    z.ApplicationSession.onLeave.<locals>.disconnect)
rö   r   ZREASON_DEFAULTr?   rŠ   r   r   rH  r>   rÁ   )rR   rð   ry   rÂ   r=   r5   rQ   r6   r÷   z  s    
zApplicationSession.onLeaver;  c                 C   sj   | j s| j d¡ dS | jsH|s$d}tjj||d�}| j |¡ d| _n| j d¡ | jdkpd| jj	}|S )zL
        Implements :meth:`autobahn.wamp.interfaces.ISession.leave`
        z6session is not joined on a realm - no session to leaveNzwamp.close.normalr;  TzBsession was already requested to leave - not sending GOODBYE again)
rG   r?   rŠ   r¤   r
   r   r!  rE   rÉ   Ú	is_closed)rR   rö   r   r|   rI  r5   r5   r6   r:   Œ  s    zApplicationSession.leavec                 C   s   t  ¡ }|  |¡ dS )zS
        Implements :meth:`autobahn.wamp.interfaces.ISession.onDisconnect`
        N)r   ÚTransportLostrH  )rR   ry   r5   r5   r6   r=  ¢  s    zApplicationSession.onDisconnect)rþ   rU   c           
   
   O   s$  t |ƒtkst‚|dks,t |ƒttfks,t‚|dksDt |ƒtksDt‚tj|d | j	j
¡dddd� | dd¡}|r†t|tjƒs†tdƒ‚| js”t ¡ ‚| j ¡ }d}| jrº| j d|||¡}|�r|rðtj||f|j|j|j|jdœ| ¡ —Ž}ntj|||j|j|j|jd�}n8|�r6tj||f||d	œ| ¡ —Ž}ntj||||d	�}|�rž|jdk	�rb|j|_|jdk	�rv|j|_|jdk	�rŠ|j|_|j dk	�rž|j |_ |�rÎ|j!�rÎt" #¡ }t$|||dk	d
�| j%|< nd}z| j &|¡ W n< tk
�r }	 z|| j%k�r
| j%|= |	‚W 5 d}	~	X Y nX |S )zP
        Implements :meth:`autobahn.wamp.interfaces.IPublisher.publish`
        Nz{}.publish()F©r   ÚstrictZallow_empty_componentsZ
allow_noner*  z,options must be of type a.w.t.PublishOptionsTrj   ©rg   rh   r  )'rq   rr   r  ro   r  r  r   Úcheck_or_raise_urir�   rs   r—   r%  rp   r   ZPublishOptionsr�   rE   r   rJ  rP   ÚnextrO   ru   r1  rk   rl   rm   rn   Úmessage_attrÚcorrelation_idÚcorrelation_uriÚcorrelation_is_anchorÚcorrelation_is_lastZacknowledger>   Úcreate_futurer)   r¥   rÉ   )
rR   rþ   rg   rh   r*  rB  r{   r|   r&  r•   r5   r5   r6   Úpublish°  sŽ    ü
ÿûúûÿýüý	zApplicationSession.publish)r  rþ   r*  Úcheck_typesrU   c              
      s6  t |ƒr|dk	s"t|dƒr|r"t‚|dks:t|ƒtks:t‚|dksRt|tjƒsRt‚ˆ js`t	 
¡ ‚‡ fdd„}t |ƒr„|d||||ƒS g }t |jt¡D ]Œ}|d }d|jkr–|jd D ]j}	|	 ¡ r¶|	 ¡ }
|	jpÒ|}|dk�r|	jtjjk� rütjdd�}ntjd	d�}| ||||
||	jƒ¡ q¶q–tj|d
d�S dS )zS
        Implements :meth:`autobahn.wamp.interfaces.ISubscriber.subscribe`
        Nrs   c           	         sê   t j|d ˆ jj¡dddd� ˆ j ¡ }t ¡ }|r>ˆ  	|¡}t
|| |rN|jnd ƒ}t||||ƒˆ j|< |r‚t j||f| ¡ Ž}nt  ||¡}|rÚ|jd k	r¤|j|_|jd k	r¶|j|_|jd k	rÈ|j|_|jd k	rÚ|j|_ˆ j |¡ |S )Nz{}.subscribe()FTrK  )r   rN  r�   rs   r—   rP   rO  r>   rU  rß   r&   r$  r*   r¦   r2  rP  rQ  rR  rS  rT  rE   rÉ   )	r#  r  rþ   r*  rW  rB  r&  Zhandler_objr|   rQ   r5   r6   Ú
_subscribe  s4    ü





z0ApplicationSession.subscribe.<locals>._subscriber
  rb   Zwildcard)ÚmatchÚexactT©Zconsume_exceptions)Úcallablerc   r  rq   rr   rp   r   r    rE   r   rJ  r1   Ú
getmembersrs   r7   Ú__dict__Z
is_handlerr   r*  Zuri_typere   ZURI_TYPE_WILDCARDrÙ   Ú_check_typesr>   Úgather)rR   r  rþ   r*  rW  rX  Ú
on_repliesÚkr	  Úpatrt   Zsuboptsr5   rQ   r6   Ú	subscribe  s,    " 


zApplicationSession.subscribec                 C   sÌ   t |tƒst‚|jst‚|j| jks(t‚|| j|j ks<t‚| jsJt ¡ ‚| j|j  	|¡ d|_t
| j|j ƒ}|dkr¾| j ¡ }t ¡ }t|||jƒ| j|< t ||j¡}| j |¡ |S t |¡S dS )zU
        Called from :meth:`autobahn.wamp.protocol.Subscription.unsubscribe`
        Fr   N)rp   r%   r  r)  r  r«   rE   r   rJ  Úremover,  rP   rO  r>   rU  r+   r§   r   r3  rÉ   rC  )rR   r  ZscountrB  r&  r|   r5   r5   r6   Ú_unsubscribeQ  s"    

zApplicationSession._unsubscribe)r  rU   c           	         s$  t |ƒtkst‚|dks,t |ƒttfks,t‚|dksDt |ƒtksDt‚tj|d ˆj	j
¡dddd� | dd¡}|r†t|tjƒs†tdƒ‚ˆjs”t ¡ ‚ˆj ¡ ‰ d}ˆjrØzˆj d|||¡}W n   ˆj ¡  ‚ Y nX |�r0|�rtjˆ |f|j|j|j|jdœ| ¡ —Ž}ntjˆ ||j|j|j|jd�}n8|�rVtjˆ |f||d	œ| ¡ —Ž}ntjˆ |||d	�}|�r¾|jdk	�r‚|j|_|j dk	�r–|j |_ |j!dk	�rª|j!|_!|j"dk	�r¾|j"|_"‡ ‡fd
d„}t#j$|d�}t%ˆ |||ƒˆj&ˆ < zˆj '|¡ W n"   ˆ ˆj&k�rˆj&ˆ = ‚ Y nX |S )a{  
        Implements :meth:`autobahn.wamp.interfaces.ICaller.call`

        .. note::

            Regarding type hints for ``*args`` and ``**kwargs``, doesn't work as we
            can receive any Python types as list items or dict values, and because
            of what is discussed here
            https://adamj.eu/tech/2021/05/11/python-type-hints-args-and-kwargs/
        Nz	{}.call()FrK  r*  z)options must be of type a.w.t.CallOptionsTrj   rM  c                    s   t  ˆ ¡}ˆj |¡ d S r0   )r   ZCancelrE   rÉ   )rÂ   Z
cancel_msg©rB  rR   r5   r6   Ú	cancellerÁ  s    
z*ApplicationSession.call.<locals>.canceller)rh  )(rq   rr   r  ro   r  r  r   rN  r�   rs   r—   r%  rp   r   ZCallOptionsr�   rE   r   rJ  rP   rO  rO   ru   r?   Zfailurer0  rk   rl   rm   rn   rP  rQ  rR  rS  rT  r>   rU  r,   r¨   rÉ   )	rR   r  rg   rh   r*  r{   r|   rh  r&  r5   rg  r6   Úcalls  s”    ü

ÿûúûÿýüý	zApplicationSession.call)r-  r  r*  ÚprefixrW  rU   c              
      sÔ   t |ƒr|dk	s"t|dƒr|r"t‚ˆjs0t ¡ ‚‡ ‡fdd„}t |ƒrV|d||||ƒS g }t |jt	¡D ]X}|d }	d|	j
krh|	j
d D ]6}
|
 ¡ rˆ|
 ¡ }|
jp¤|}| |||	|||
jƒ¡ qˆqhtj|dd�S dS )	zN
        Implements :meth:`autobahn.wamp.interfaces.ICallee.register`
        Nrs   c           	         sþ   t j|d ˆjj¡dddd� ˆj ¡ }t ¡ }|r>ˆ 	|¡}t
|| |rN|jnd ƒ}ˆ d k	rhd ˆ |¡}t||||ƒˆj|< |r–t j||f| ¡ Ž}nt  ||¡}|rî|jd k	r¸|j|_|jd k	rÊ|j|_|jd k	rÜ|j|_|jd k	rî|j|_ˆj |¡ |S )Nz{}.register()FTrK  z{}{})r   rN  r�   rs   r—   rP   rO  r>   rU  rß   r(   r$  r.   r©   r4  rP  rQ  rR  rS  rT  rE   rÉ   )	r#  r  r  r*  rW  rB  r&  Zendpoint_objr|   ©rj  rR   r5   r6   Ú	_registerè  s8    ü





z.ApplicationSession.register.<locals>._registerr
  rb   Tr[  )r\  rc   r  rE   r   rJ  r1   r]  rs   r7   r^  Zis_endpointr   r*  rÙ   r_  r>   r`  )rR   r-  r  r*  rj  rW  rl  ra  rb  r	  rc  rt   Zregoptsr5   rk  r6   ÚregisterÜ  s     ""

zApplicationSession.registerc                 C   sz   t |tƒst‚|jst‚|j| jks(t‚| js6t ¡ ‚| j	 
¡ }t ¡ }t|||jƒ| j|< t ||j¡}| j |¡ |S )zT
        Called from :meth:`autobahn.wamp.protocol.Registration.unregister`
        )rp   r'   r  r)  r  r¬   rE   r   rJ  rP   rO  r>   rU  r/   rª   r   r5  rÉ   )rR   r  rB  r&  r|   r5   r5   r6   Ú_unregister  s    

zApplicationSession._unregister)N)NNNNNNN)NN)NNN)NNNN)9r—   r˜   r™   rš   r   r   r¢   rS   r›   rŸ   r   r   r±   r²   r   r¿   r»   rr   r   r   r   rœ   r�   r9   r=   r‘   rµ   rß   r   r:  r>  r   r   r   rå   r   r  r  rH  r   r÷   r:   r=  r$   rV  r   r   r    r%   rd  rf  r!   ri  r"   r'   rm  rn  r5   r5   r5   r6   rž   e  s¦   	
       ø
ø%

     o
#
&
Z    ÿ þE"h     þ  þArž   c                   @   st   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú_SessionShimar  
    shim that lets us present pep8 API for user-classes to override,
    but also backwards-compatible for existing code using
    ApplicationSession "directly".

    **NOTE:** this is not public or intended for use; you should import
    either autobahn.asyncio.wamp.Session or
    autobahn.twisted.wamp.Session depending on which async
    framework yo're using.
    Nc                 C   s
   |   |¡S r0   )Úon_joinr?  r5   r5   r6   rå   C  s    z_SessionShim.onJoinc                 C   sn   | j rbdd„ | j  ¡ D ƒd }dd„ | j  ¡ D ƒd }|  ¡ }| j| jjt| j  ¡ ƒ|||d� n|  ¡  d S )Nc                 S   s   g | ]}|j  d d¡‘qS )r\   N©Ú_argsÚget©rÑ   Úxr5   r5   r6   rÓ   K  s     z*_SessionShim.onConnect.<locals>.<listcomp>éÿÿÿÿc                 S   s   g | ]}|j  d d¡‘qS )r]   Nrq  rt  r5   r5   r6   rÓ   L  s     )rÄ   r\   r]   r`   )	Ú_authenticatorsrE  Ú_merged_authextrar9   rŸ   rZ   ro   ÚkeysÚ
on_connect)rR   r\   r]   r`   r5   r5   r6   r»   F  s    ûz_SessionShim.onConnectc                 C   sR   z| j |j }W n4 tk
rD   td |jtt| j  ¡ ƒƒ¡ƒ‚Y nX | | |¡S )NzBReceived challenge for unknown authmethod '{}' [authenticators={}])	rw  r  r/  rd   r�   rr   Úsortedry  Zon_challenge)rR   r6  Úauthenticatorr5   r5   r6   r   [  s    þÿ
z_SessionShim.onChallengec                 C   sl   |j d ks| jd krd S z| j|j  }W n4 tk
r\   td |j tt| j ¡ ƒƒ¡ƒ‚Y nX | | |j	¡S )NzBReceived onWelcome for unknown authmethod '{}' [authenticators={}])
r^   rw  r/  rd   r�   rr   r{  ry  Z
on_welcomer`   )rR   r|   r|  r5   r5   r6   r  g  s    þÿ
z_SessionShim.onWelcomec                 C   s
   |   |¡S r0   )Úon_leaver?  r5   r5   r6   r÷   v  s    z_SessionShim.onLeavec                 C   s   |   ¡ S r0   )Úon_disconnectrQ   r5   r5   r6   r=  y  s    z_SessionShim.onDisconnectc                    s–   t ˆ tƒst‚ˆjd kri ˆ_‡ ‡fdd„}|dƒ |dƒ ˆ j}ˆ ¡ }| ¡ D ]2\}}||krR|| |krRtd |||| ¡ƒ‚qRˆ ˆjˆ j	< d S )Nc                    sL   t ‡ fdd„tˆj ¡ ƒˆg D ƒƒ}t|ƒdkrHtd ˆ d |¡¡ƒ‚d S )Nc                    s    g | ]}ˆ |j kr|j ˆ  ‘qS r5   )rr  ©rÑ   Úa©rÜ   r5   r6   rÓ   ‰  s   
þzG_SessionShim.add_authenticator.<locals>.at_most_one.<locals>.<listcomp>r
  zInconsistent {}s: {}ú )Úsetro   rw  rE  r,  Ú
ValueErrorr�   r9   )rÜ   Úuni©r|  rR   r�  r6   Úat_most_oneˆ  s    þþÿz3_SessionShim.add_authenticator.<locals>.at_most_oner\   r]   z4Inconsistent authextra values for '{}': '{}' vs '{}')
rp   r   r  rw  r`   rx  rÖ   r„  r�   rÜ   )rR   r|  r‡  r`   Zmergedrb  Úvr5   r†  r6   Úadd_authenticator~  s$    
  ÿÿz_SessionShim.add_authenticatorc                    sH   dd„ | j  ¡ D ƒ‰ dd„ }t|ˆ tƒ ƒ}‡ fdd„‰‡fdd„|D ƒS )	a:  
        internal helper

        :returns: a single 'authextra' dict, consisting of all keys
            from any authenticator's authextra.

        Note that when the authenticator was added, we already checked
        that any keys it does contain has the same value as any
        existing authextra.
        c                 S   s   g | ]
}|j ‘qS r5   )r`   r  r5   r5   r6   rÓ   ¶  s     z2_SessionShim._merged_authextra.<locals>.<listcomp>c                 S   s   | t | ¡ ƒB S r0   )rƒ  ry  )ru  Úyr5   r5   r6   Úextract_keys¸  s    z4_SessionShim._merged_authextra.<locals>.extract_keysc                    s0   ˆ D ]}| |kr||    S qt d | ¡ƒ‚dS )zÌ
            for anything already in self._authenticators, we checked
            that it has the same value for any keys in its authextra --
            so here we just extract the first one
            zNo values for '{}'N)r„  r�   )rb  r`   )Ú
authextrasr5   r6   Úfirst_value_for½  s    ÿz7_SessionShim._merged_authextra.<locals>.first_value_forc                    s   i | ]}|ˆ |ƒ“qS r5   r5   )rÑ   rb  )r�  r5   r6   Ú
<dictcomp>Ë  s   ÿ z2_SessionShim._merged_authextra.<locals>.<dictcomp>)rw  rE  r	   rƒ  )rR   r‹  Zunique_keysr5   )rŒ  r�  r6   rx  «  s    
þz_SessionShim._merged_authextrac                 C   s   d S r0   r5   r?  r5   r5   r6   rp  Ó  s    z_SessionShim.on_joinc                 C   s   |   ¡  d S r0   )r=   r?  r5   r5   r6   r}  Ö  s    z_SessionShim.on_leavec                 C   s   |   | jj¡ d S r0   )r9   rŸ   rZ   rQ   r5   r5   r6   rz  Ù  s    z_SessionShim.on_connectc                 C   s   d S r0   r5   rQ   r5   r5   r6   r~  Ü  s    z_SessionShim.on_disconnect)r—   r˜   r™   rš   rw  rå   r»   r   r  r÷   r=  r‰  rx  rp  r}  rz  r~  r5   r5   r5   r6   ro  4  s   -(ro  c                   @   s&   e Zd ZdZeZddd„Zdd„ ZdS )ÚApplicationSessionFactoryz(
    WAMP endpoint session factory.
    Nc                 C   s   |pt jdd�| _dS )z•

        :param config: The default component configuration.
        :type config: instance of :class:`autobahn.wamp.types.ComponentConfig`
        r    r¡   N)r   r¢   rŸ   r®   r5   r5   r6   rS   î  s    z"ApplicationSessionFactory.__init__c                 C   s   |   | j¡}| |_|S )z²
        Creates a new WAMP application session.

        :returns: -- An instance of the WAMP application session class as
                     given by `self.session`.
        )rã   rŸ   Úfactory)rR   rã   r5   r5   r6   Ú__call__ö  s    z"ApplicationSessionFactory.__call__)N)r—   r˜   r™   rš   rž   rã   rS   r‘  r5   r5   r5   r6   r�  ä  s   
r�  )AÚtypingr   r   r   r   r   r   r   r>   r1   Ú	functoolsr	   Úautobahnr
   Zautobahn.utilr   r   r   Zautobahn.wampr   r   r   r   r   Zautobahn.wamp.exceptionr   r   r   r   Zautobahn.wamp.interfacesr   r   r   r   r   Zautobahn.wamp.typesr   r   r   r   r    r!   r"   Zautobahn.exceptionr#   Zautobahn.wamp.requestr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r7   r8   rž   ro  Zabc_registerÚobjectr�  r5   r5   r5   r6   Ú<module>   sH   $$8  (           Y .
