ó
    ð›‘hÕ–  ã                   óÚ   • S SK r S SKrS SKJr  S SKrS SKJr  S SKJr	  S SK
Jr  S SKJrJrJr  S SKJrJr  S SKJrJr  S SKJr  S	rSS
 jrSS jr " S S\5      r " S S	\5      rSS jrg)é    N)Úpartial)ÚObservableMixin)Ú	parse_url)ÚComponentConfigÚSubscribeOptionsÚRegisterOptions)ÚSessionNotReadyÚApplicationError)Úcreate_authenticatorÚIAuthenticator)ÚSERID_TO_SERÚ	Componentc                 óâ  • U(       a	  U" U 5        O [        U [        5      (       d  [        S5      e[        U [        5      (       Ga)  SU ;  a  [        S5      eU S   S;  a  [        SR                  U S   5      5      eU R	                  5        H#  nUS;  d  M  [        SR                  U5      5      e   U S   S:X  aQ  S	 H"  nX ;  d  M
  [        S
R                  U5      5      e   S H"  nX ;   d  M
  [        SR                  U5      5      e   gU S   S:X  aQ  S H"  nX ;  d  M
  [        SR                  U5      5      e   S H"  nX ;   d  M
  [        SR                  U5      5      e   g S5       eg)z1
Check a WAMP connecting endpoint configuration.
z'endpoint' must be a dictÚtypez)'type' required in endpoint configuration)ÚtcpÚunixzinvalid type "{}" in endpoint)r   ÚhostÚportÚpathÚtlsÚtimeoutÚversionz*Invalid key '{}' in endpoint configurationr   ©r   r   z&'{}' required in 'tcp' endpoint config)r   z''{}' not valid in 'tcp' endpoint configr   z('{}' required for 'unix' endpoint config)r   r   r   z('{}' not valid in 'unix' endpoint configúshould not arrive hereN)Ú
isinstanceÚdictÚ
ValueErrorÚformatÚkeys)ÚendpointÚcheck_native_endpointÚks      Ú[C:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\autobahn/wamp/component.pyÚ_validate_endpointr$   1   s�  € ö Ù˜hÕ'Ü˜¤$×'Ñ'ÜØ'ó
ð 	
ô �(œD×!Ò!ð ˜Ó!äÐHÓIÐIØ�FÑ ?Ó2ÜÐ<×CÑCÀHÈVÑDTÓUÓVÐVà—‘–ˆAØÐUÕUÜ Ø@×GÑGÈÓJóð ñ !ð �FÑ˜uÓ$Û%�ØÕ$Ü$Ø@×GÑGÈÓJóð ñ &ó
 �Ø•=Ü$ØA×HÑHÈÓKóð ò ð
 �fÑ Ó'Û�ØÕ$Ü$ØB×IÑIÈ!ÓLóð ñ ó
 -�Ø•=Ü$ØB×IÑIÈ!ÓLóð ò -ð 3Ð2Ó2�5ðM "ó    c                 óF  • [        U5      [        :w  a#  [        SR                  [        U5      5      5      e/ SQnUR	                  5        H"  nXC;  d  M
  [        SR                  U5      5      e   SnSU;   a,  US   S;  a  [        SR                  US   5      5      eUS   nOSUS'   SU;   a  US:w  a  [        S	5      eUR                  SS
5      nUb_  UR	                  5        H#  nUS;  d  M  [        SR                  U5      5      e   S H"  nXF;  d  M
  [        SR                  U5      5      e   [        5       nSU;   a=  US   n[        U[        5      (       d#  [        SR                  [        U5      5      5      eUR                  S5      nUS:X  Ga\  S H"  n	X‘;  d  M
  [        SR                  U	5      5      e   SU;  a  [        US   5      u  p«pÍpïSUUU
S.nOUS   n[        UU5        SU;   a  [        S5      eSU;   a×  [        US   [        [        45      (       d  [        S5      e[        US    Vs/ s H  n[        U[        [        45      PM     sn5      (       d  [        S5      e[        R                  " 5       nUS    HM  nUU;  d  M  [        SR                  USR                  U Vs/ s H  n[!        U5      PM     sn5      5      5      e   UR                  SSS/5      nOæUS:X  aÙ  SU;  au  US   R#                  S 5      (       a  [%        US   5      u  np¼O7US   R#                  S!5      (       a  [        US   5      u  np¼pÞnO
['        5       eUS":X  a  S"US#.nOSUUS$.nOUS   nSU;   a  [        S%5      eUb  [        S&5      eSU;   a0  [        US   [        [        45      (       d  [        S'5      eUS   /nOS/nO S(5       e0 nS) H  n	X‘;   d  M
  X   UU	'   M     [)        U 4UUR                  SS
5      UUUUUS*.UD6$ s  snf s  snf )+zè
Internal helper to insert defaults and create _Transport instances.

:param transport: a (possibly valid) transport configuration
:type transport: dict

:returns: a _Transport instance

:raises: ValueError on invalid configuration
z<invalid type {} for transport configuration - must be a dict)r   Úurlr    Ú
serializerÚserializersÚoptionsÚmax_retriesÚmax_retry_delayÚinitial_retry_delayÚretry_delay_growthÚretry_delay_jitterÚproxyÚheadersz&'{}' is not a valid configuration itemÚ	websocketr   )r2   Ú	rawsocketzInvalid transport type {}r0   z3proxy= only supported for type=websocket transportsNr   z Unknown key '{}' in proxy configzProxy config requires '{}'r*   zoptions must be a dict, not {}r1   )r'   zTransport requires '{}' keyr    r'   r   )r   r   r   r   r(   z5'serializer' is only for rawsocket; use 'serializers'r)   z''serializers' must be a list of stringsz-Invalid serializer '{}' (expected one of: {})z, ÚcborÚjsonr3   ÚrsÚwsr   )r   r   )r   r   r   z5'serializers' is only for websocket; use 'serializer'z/'headers' not supported for rawsocket transportz'serializer' must be a stringr   )r+   r,   r-   r.   r/   )Úkindr'   r    r)   r0   r*   r1   )r   r   r   r   r   ÚgetÚformaTr   Úparse_ws_urlr$   ÚlistÚtupleÚallÚstrr   ÚjoinÚreprÚ
startswithÚparse_rs_urlÚRuntimeErrorÚ
_Transport)ÚindexÚ	transportr!   Úvalid_transport_keysr"   r8   r0   r*   r1   ÚkeyÚ	is_securer   r   Úresourcer   ÚparamsÚendpoint_configÚsÚvalid_serializersÚserialÚserializer_configÚisSecureÚkws                          r#   Ú_create_transportrT   j   s«  € ô ˆIƒœ$ÓÜÐW×^Ñ^Ô_cÐdmÓ_nÓoÓpÐpòÐð
 �^‰^ÖˆØÕ(ÜØ8×?Ñ?ÀÓBóð ñ ð €DØ�ÓØ�VÑÐ$>Ó>ÜÐ8×?Ñ?À	È&Ñ@QÓRÓSÐSØ˜Ñ ‰à'ˆ	�&Ñà�)Ó ¨Ó 3ÜØAó
ð 	
ð �M‰M˜' 4Ó(€EØÑØ—‘–ˆAØÐ(Õ(Ü Ø6×=Ñ=¸aÓ@óð ñ ó
 "ˆAØ�~Ü Ø0×7Ñ7¸Ó:óð ñ "ô ‹f€GØ�IÓØ˜IÑ&ˆÜ˜'¤4×(Ñ(ÜØ0×7Ñ7¼¸W»ÓFóð ð �m‰m˜IÓ&€Gàˆ{ÔÛˆCØÕ#Ü Ð!>×!EÑ!EÀcÓ!JÓKÐKñ ð
 ˜YÓ&Ü<HÈÐSXÑIYÓ<ZÑ9ˆI˜T¨TàØØØ ñ	‰Oð (¨
Ñ3ˆOÜ˜Ð0EÔFà˜9Ó$ÜÐTÓUÐUØ˜IÓ%Ü˜i¨Ñ6¼¼u¸×FÑFÜ Ð!JÓKÐKÜà& }Ò5ó7â5˜ô ˜q¤3¬ *Ö-Ù5ñ7÷ 8ñ 8ô !Ð!JÓKÐKÜ ,× 1Ò 1Ó 3ÐØ# MÔ2�ØÐ!2Õ2Ü$ØG×NÑNØ"Ø ŸI™IÑ8IÓ&JÒ8I°1¤t¨A¦wÑ8IÑ&JÓKóóð ñ 3ð &ŸM™M¨-¸&À&Ð9IÓJÑà	�Ó	Ø˜YÓ&Ø˜Ñ×*Ñ*¨4×0Ñ0ä'3°I¸eÑ4DÓ'EÑ$�˜$ Ø˜5Ñ!×,Ñ,¨T×2Ñ2ä?KÈIÐV[ÑL\Ó?]Ñ<�˜$ h±fä"“nÐ$Ø�v‹~ð #Ø ñ#‘ð "Ø Ø ñ#‘ð (¨
Ñ3ˆOØ˜IÓ%ÜÐTÓUÐUØÑÜÐNÓOÐOà˜9Ó$Ü˜i¨Ñ5¼¼S°z×BÑBÜ Ð!@ÓAÐAØ!*¨<Ñ!8Ð 9Ñà!' Ñð 	/Ð.Ó.ˆuà	€Bó<ˆàÕØ‘nˆBˆs‹Gñ<ô
 Øð
àØ�M‰M˜% Ó&Ø Ø%ØØØñ
ð ñ
ð 
ùòy7ùò 'Ks   È? PÊ;Pc                   óP   • \ rS rSrSr        SS jrS rS rS rS r	S	 r
S
rg)rE   i  z8
Thin-wrapper for WAMP transports used by a Connection.
Nc                 ó<  • Uc
  [        5       nXl        X l        X0l        X@l        XÀl        XÐl        XPl        U R                  S:X  a  [        U5      S:w  a  [        S5      eX`l
        Xpl        X€l        X�l        X l        X°l        SU l        U R#                  5         g)z	
        Nr3   é   z5'rawsocket' transport requires exactly one serializerF)r   Úidxr   r'   r    r*   r1   r)   Úlenr   r+   r,   r-   r.   r/   r0   Ú_permanent_failureÚreset)ÚselfrX   r8   r'   r    r)   r+   r,   r-   r.   r/   r0   r*   r1   s                 r#   Ú__init__Ú_Transport.__init__  s”   € ð ‰?Ü“fˆGØŒàŒ	ØŒØ ŒØŒØŒà&ÔØ�9‰9˜Ó#¬¨KÓ(8¸AÓ(=ÜØGóð ð 'ÔØ.ÔØ#6Ô Ø"4ÔØ"4ÔØŒ
ð #(ˆÔà�
‰
�r%   c                 óP   • SU l         SU l        SU l        U R                  U l        g)z@
set connection failure rates and retry-delay to initial values
r   N)Úconnect_attemptsÚconnect_sucessesÚconnect_failuresr-   Úretry_delay©r\   s    r#   r[   Ú_Transport.reset5  s*   € ð !"ˆÔØ !ˆÔØ !ˆÔØ×3Ñ3ˆÕr%   c                 ó   • SU l         g)z˜
Mark this transport as failed, meaning we won't try to connect to
it any longer (that is: can_reconnect() will always return
False afer calling this).
TN)rZ   rd   s    r#   ÚfailedÚ_Transport.failed>  s   € ð #'ˆÕr%   c                 ó€   • U R                   (       a  gU R                  S:X  a  gU R                  U R                  S-   :  $ )NFéÿÿÿÿTrW   )rZ   r+   r`   rd   s    r#   Úcan_reconnectÚ_Transport.can_reconnectF  s;   € Ø×"×"ØØ×Ñ˜rÓ!ØØ×$Ñ$ t×'7Ñ'7¸!Ñ';Ñ;Ð;r%   c                 ó¸  • U R                   S:X  a  gU R                  S:w  a(  U R                   U R                  S-   :¼  a  [        S5      eU R                  U R                  -  U l        [
        R                  " U R                  U R                  U R                  -  5      U l        U R                  U R                  :”  a  U R                  U l        U R                  $ )Nr   rj   rW   zmax reconnects reached)	r`   r+   rD   rc   r.   ÚrandomÚnormalvariater/   r,   rd   s    r#   Ú
next_delayÚ_Transport.next_delayM  sº   € Ø× Ñ  AÓ%àØ×Ñ Ó#¨×(=Ñ(=À×AQÑAQÐTUÑAUÓ(UÜÐ7Ó8Ð8à#×/Ñ/°$×2IÑ2IÑIˆDÔÜ%×3Ò3°D×4DÑ4DÀd×FVÑFVÐY]×YpÑYpÑFpÓqˆDÔØ×Ñ $×"6Ñ"6Ó6Ø#'×#7Ñ#7�Ô Ø×#Ñ#Ð#r%   c                 óˆ   • [        U R                  [        5      (       a  U R                  S   $ [        U R                  5      $ )z6
returns a human-readable description of the endpoint
r   )r   r    r   rA   rd   s    r#   Údescribe_endpointÚ_Transport.describe_endpointZ  s3   € ô �d—m‘m¤T×*Ñ*Ø—=‘= Ñ(Ð(Ü�D—M‘MÓ"Ð"r%   )rZ   r`   rb   ra   r    r1   rX   r-   r+   r,   r*   r0   rc   r.   r/   r)   r   r'   )rj   i,  ç      ø?ru   gš™™™™™¹?NNN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r]   r[   rg   rk   rp   rs   Ú__static_attributes__© r%   r#   rE   rE     s@   † ñð
  Ø!$Ø%(Ø$'Ø$'ØØØô&òP4ò'ò<ò$õ#r%   rE   c                   ó€   • \ rS rSrSrSr SS jrSS jr  SS jrS r	SS jr
S	 rS
 rS rS rS rS rS rS rSrg)r   ig  zv
A WAMP application component. A component holds configuration for
(and knows how to create) transports and sessions.
Nc                 óT   ^ ^^^• Tb  [        T[        5      (       d   eUUU U4S jnU$ )a  
A decorator as a shortcut for subscribing during on-join

For example::

    @component.subscribe(
        "some.topic",
        options=SubscribeOptions(match='prefix'),
    )
    def topic(*args, **kw):
        print("some.topic({}, {}): event received".format(args, kw))
c                 ó@   >^ • UU UU4S jnTR                  SU5        T $ )Nc                 ó(   >• U R                  TTTTS9$ )N)Útopicr*   Úcheck_types)Ú	subscribe)ÚsessionÚdetailsr‚   Úfnr*   r�   s     €€€€r#   Údo_subscriptionÚ?Component.subscribe.<locals>.decorator.<locals>.do_subscriptionƒ  s   ø€ Ø×(Ñ(¨°5À'ÐWbÐ(ÐcÐcr%   r@   ©Úon)r†   r‡   r‚   r*   r\   r�   s   ` €€€€r#   Ú	decoratorÚ&Component.subscribe.<locals>.decorator�  s"   ù€ ÷dð dà�G‰G�F˜OÔ,ØˆIr%   )r   r   )r\   r�   r*   r‚   r‹   s   ```` r#   rƒ   ÚComponent.subscriber  s/   û€ ð ‰¤*¨WÔ6F×"GÑ"GÐGÐG÷	ð 	ð Ðr%   c                 óT   ^ ^^^• Tb  [        T[        5      (       d   eUUU U4S jnU$ )a  
A decorator as a shortcut for registering during on-join

For example::

    @component.register(
        "com.example.add",
        options=RegisterOptions(invoke='roundrobin'),
    )
    def add(*args, **kw):
        print("add({}, {}): event received".format(args, kw))
c                 ó@   >^ • UU UU4S jnTR                  SU5        T $ )Nc                 ó(   >• U R                  TTTTS9$ )N)Ú	procedurer*   r‚   )Úregister)r„   r…   r‚   r†   r*   Úuris     €€€€r#   Údo_registrationÚ>Component.register.<locals>.decorator.<locals>.do_registrationš  s   ø€ Ø×'Ñ'¨°cÀ7ÐXcÐ'ÐdÐdr%   r@   r‰   )r†   r”   r‚   r*   r\   r“   s   ` €€€€r#   r‹   Ú%Component.register.<locals>.decorator˜  s"   ù€ ÷eð eà�G‰G�F˜OÔ,ØˆIr%   )r   r   )r\   r“   r*   r‚   r‹   s   ```` r#   r’   ÚComponent.register‰  s.   û€ ð ‰¤*¨W´o×"FÑ"FÐFÐF÷	ð 	ð Ðr%   c	                 ó”  • U R                  / SQ5        Ub  [        U5      (       d  [        S5      eX€l        Ub  [        U5      (       d  [        S5      eXl        Uc  Sn[        U[        [        45      (       a  Un	SU	S.n
U
/nO[        U[        5      (       a  U/n/ U l        [        U5       HO  u  pº[        U
5      [        :X  a  SU
S.nOU
nU R                  R                  [        X¼U R                  5      5        MQ     U=(       d    0 U l        U(       a  Xpl        X@l        XPl        SU l        SU l        SU l        SU l        g)	a§
  
:param main: After a transport has been connected and a session
    has been established and joined to a realm, this (async)
    procedure will be run until it finishes -- which signals that
    the component has run to completion. In this case, it usually
    doesn't make sense to use the ``on_*`` kwargs. If you do not
    pass a main() procedure, the session will not be closed
    (unless you arrange for .leave() to be called).

:type main: callable taking two args ``reactor`` and ``ISession``

:param transports: Transport configurations for creating
    transports. Each transport can be a WAMP URL, or a dict
    containing the following configuration keys:

        - ``type`` (optional): ``websocket`` (default) or ``rawsocket``
        - ``url``: the router URL
        - ``endpoint`` (optional, derived from URL if not provided):
            - ``type``: "tcp" or "unix"
            - ``host``, ``port``: only for TCP
            - ``path``: only for unix
            - ``timeout``: in seconds
            - ``tls``: ``True`` or (under Twisted) an
              ``twisted.internet.ssl.IOpenSSLClientComponentCreator``
              instance (such as returned from
              ``twisted.internet.ssl.optionsForClientTLS``) or
              ``CertificateOptions`` instance.
        - ``max_retries``: Maximum number of reconnection attempts. Unlimited if set to -1.
        - ``initial_retry_delay``: Initial delay for reconnection attempt in seconds (Default: 1.0s).
        - ``max_retry_delay``: Maximum delay for reconnection attempts in seconds (Default: 60s).
        - ``retry_delay_growth``: The growth factor applied to the retry delay between reconnection attempts (Default 1.5).
        - ``retry_delay_jitter``: A 0-argument callable that introduces nose into the delay. (Default random.random)
        - ``serializer`` (only for raw socket): Specify an accepted serializer (e.g. 'json', 'msgpack', 'cbor', 'ubjson', 'flatbuffers')
        - ``serializers``: Specify list of accepted serializers
        - ``options``: tbd
        - ``proxy``: tbd

:type transports: None or str or list

:param realm: the realm to join
:type realm: str

:param authentication: configuration of authenticators
:type authentication: dict

:param session_factory: if None, ``ApplicationSession`` is
    used, otherwise a callable taking a single ``config`` argument
    that is used to create a new `ApplicationSession` instance.

:param is_fatal: a callable taking a single argument, an
    ``Exception`` instance. The callable should return ``True`` if
    this error is "fatal", meaning we should not try connecting to
    the current transport again. The default behavior (on None) is
    to always return ``False``
)ÚstartÚconnectr@   ÚreadyÚleaveÚ
disconnectÚconnectfailureNz%"is_fatal" must be a callable or Nonez""main" must be a callable if givenzws://127.0.0.1:8080/wsr2   )r   r'   F)Úset_valid_eventsÚcallabler   Ú	_is_fatalÚ_entryr   r?   r   Ú_transportsÚ	enumerater   ÚappendrT   Ú_check_native_endpointÚ_authenticationÚsession_factoryÚ_realmÚ_extraÚ_delay_fÚ_done_fÚ_sessionÚ	_stopping)r\   ÚmainÚ
transportsÚconfigÚrealmÚextraÚauthenticationr¨   Úis_fatalr'   rG   rX   Ú
_transports                r#   r]   ÚComponent.__init__   sJ  € ðr 	×Ñòô
	
ð Ñ¬°×(:Ñ(:ÜÐDÓEÐEØ!ŒàÑ¤H¨T§N¡NÜÐAÓBÐBØŒð ÑØ1ˆJô �j¤3¬ *×-Ñ-ØˆCð $ØñˆIð $˜‰Jô ˜
¤D×)Ñ)Ø$˜ˆJð ˆÔÜ'¨
Ö3‰NˆCä�I‹¤#Ó%à'Ø$ñ‘
ð
 '�
Ø×Ñ×#Ñ#Ü! #°4×3NÑ3NÓOöñ 4ð  .×3°ˆÔæØ#2Ô ØŒØŒàˆŒØˆŒØˆŒØˆ�r%   c                 óX   • U R                    H  nUR                  5       (       d  M    g   g)NTF)r£   rk   )r\   rG   s     r#   Ú_can_reconnectÚComponent._can_reconnect  s)   € à×)Ô)ˆIØ×&Ñ&×(Ó(Ùñ *ð r%   c                 ó  ^ ^^^^^^	^
• T R                   b>  [        R                  " 5       mU4S jn[        R                  " T R                   X"5        T$ [        R                  " 5       T l         U 4S jn[        R                  " T R                   X35        [        R
                  " T R                  5      m
S/mU 4S jmUU UU	4S jmUUU UU
4S jm	T R                  STT 5      n[        R                  " UT	T5        T R                   $ )a8  
This starts the Component, which means it will start connecting
(and re-connecting) to its configured transports. A Component
runs until it is "done", which means one of:

- There was a "main" function defined, and it completed successfully;
- Something called ``.leave()`` on our session, and we left successfully;
- ``.stop()`` was called, and completed successfully;
- none of our transports were able to connect successfully (failure);

:returns: a Future/Deferred which will resolve (to ``None``) when we are
    "done" or with an error if something went wrong.
c                 ó4   >• [         R                  " TU 5        g ©N)ÚtxaioÚresolve)ÚargÚds    €r#   Ú_cbÚComponent._start.<locals>._cb;  s   ø€ Ü—’˜a Õ%r%   c                 ó   >• STl         U $ )zY
if the _done_f future is resolved (good or bad), we want to set it
to None in our class
N)r¬   )rÀ   r\   s    €r#   Ú_resetÚ Component._start.<locals>._resetE  s   ø€ ð
  ˆDŒLØˆJr%   r   c                 ót  >• S Tl         TR                  (       a"  [        R                  " TR                  S 5        g TR
                  R                  S[        R                  " U 5      S9  TR
                  R                  S[        R                  " U 5      S9  [        R                  " TR                  U 5        g )NzInternal error {msg}©Úmsgú{tb}©Útb)r«   r®   r¾   r¿   r¬   ÚlogÚinfoÚfailure_messageÚdebugÚfailure_format_tracebackÚreject)Úfailr\   s    €r#   ÚerrorÚComponent._start.<locals>.errorU  sw   ø€ Ø ˆDŒMØ�~�~ô
 —’˜dŸl™l¨DÕ1à—‘—‘Ð4¼%×:OÒ:OÐPTÓ:U�ÑVØ—‘—‘˜v¬%×*HÒ*HÈÓ*N�ÑOÜ—’˜TŸ\™\¨4Õ0r%   c                 óÆ   >^^• S Tl         UUU	4S jmU4S jmUU4S jnU4S jn[        R                  " TR                  TTS   5      n[        R                  " X2U5        g )Nc                 óþ  >• TR                   R                  S[        R                  " U 5      S9  TR                   R                  S[        R                  " U 5      S9  [        U R                  [        5      (       a3  TR                   R                  SU R                  R                  5       S9  OÖ[        U R                  [        5      (       a/  TR                   R                  S[        R                  " U 5      S9  OˆTR                  U R                  5      (       a:  U R                  R                  S   S   u  pnTR                   R                  S	US
9  O.TR                   R                  S[        R                  " U 5      S9  TR                  c  SnOTR                  U R                  5      nU(       a.  TR                   R                  S5        TS   R                  5         [        R                   " STS 5        g )Nzcomponent failed: {error})rÔ   rÊ   rË   z{msg}rÈ   z&Connection failed with OS error: {msg}r   zTLS failure: {reason})ÚreasonzConnection failed: {error}Fz"Error was fatal; failing transport)rÍ   rÐ   r¾   rÏ   rÑ   r   Úvaluer
   rÔ   Úerror_messageÚOSErrorrÎ   Ú_is_ssl_errorÚargsr¡   rg   Ú
call_later)rÓ   Ússl_libÚssl_funcÚ
ssl_reasonrµ   r\   Útransport_candidateÚtransport_checks        €€€r#   Úhandle_connect_errorÚGComponent._start.<locals>.attempt_connect.<locals>.handle_connect_errore  sz  ø€ ð —‘—‘Ð:Ä%×BWÒBWÐX\ÓB]�Ñ^Ø—‘—‘˜v¬%×*HÒ*HÈÓ*N�ÑOô ˜dŸj™jÔ*:×;Ñ;Ø—H‘H—N‘N 7°·
±
×0HÑ0HÓ0J�NÒKä §
¡
¬G×4Ñ4ð —H‘H—M‘MÐ"JÔPU×PeÒPeÐfjÓPk�MÒlà×'Ñ'¨¯
©
×3Ñ3ð 59·J±J·O±OÀAÑ4FÀqÑ4IÑ1�G zØ—H‘H—N‘NÐ#:À:�NÒNà—H‘H—N‘NØ4Ü#×3Ò3°DÓ9ð #ñ ð
 —>‘>Ñ)Ø$‘Hà#Ÿ~™~¨d¯j©jÓ9�HÞØ—H‘H—M‘MÐ"FÔGØ'¨Ñ*×1Ñ1Ô3ä× Ò   O°TÔ:Ør%   c                 ó´   >^ ^• [         R                  " 5       mTR                  STT R                  5      n[         R                  " UUU 4S jUU 4S j5        T$ )Nrž   c                 ó2   >• [         R                  " TT5      $ r½   ©r¾   rÒ   ©Ú_Úchain_frÓ   s    €€r#   Ú<lambda>ÚYComponent._start.<locals>.attempt_connect.<locals>.notify_connect_error.<locals>.<lambda>ž  ó   ø€ œeŸlšl¨7°DÔ9r%   c                 ó2   >• [         R                  " TT5      $ r½   rè   ré   s    €€r#   rì   rí   Ÿ  rî   r%   )r¾   Úcreate_futureÚfirerÙ   Úadd_callbacks)rÓ   Ú	handler_frë   r\   s   ` @€r#   Únotify_connect_errorÚGComponent._start.<locals>.attempt_connect.<locals>.notify_connect_error•  sH   ú€ Ü×-Ò-Ó/�ð
 !ŸI™IÐ&6¸¸d¿j¹jÓI�	Ü×#Ò#ØÝ9Ý9ôð
 �r%   c                 óF   >• T" U 5      n[         R                  " US T5        g r½   )r¾   rò   )rÓ   Únotify_frä   rô   s     €€r#   Úconnect_errorÚ@Component._start.<locals>.attempt_connect.<locals>.connect_error£  s    ø€ Ù/°Ó5�Ü×#Ò# H¨dÐ4HÕIr%   c                 óH   >• [         R                  " TR                  S 5        g r½   )r¾   r¿   r¬   )Úxr\   s    €r#   Úsession_doneÚ?Component._start.<locals>.attempt_connect.<locals>.session_done§  s   ø€ Ü—’˜dŸl™l¨DÕ1r%   r   )r«   r¾   Ú	as_futureÚ_connect_oncerò   )
rê   rø   rü   Ú	connect_frä   rô   Úloopr\   râ   rã   s
       @@€€€€r#   Úattempt_connectÚ)Component._start.<locals>.attempt_connectb  sV   ú€ Ø ˆDŒM÷.õ`öJõ2ô ŸšØ×"Ñ"ØÐ)¨!Ñ,óˆIô ×Ò 	¸ÕGr%   c                 ót  >• TR                   R                  S5        TR                  5       (       d)  SnTR                   R                  U5         [	        U5      e [        T	5      nUR                  5       (       a  UTS'   OM(  UR                  5       nTR                   R                  SUR                  UR                  US9  [
        R                  " U5      Tl        [
        R                   " TR                  TT5        g ! [         a+  n[
        R                  " TR                  U5         S nAg S nAff = f)NzEntering re-connect loopz:Component failed: Exhausted all transport connect attemptsr   zZtrying transport {transport_idx} ("{transport_url}") using connect delay {transport_delay})Útransport_idxÚtransport_urlÚtransport_delay)rÍ   rÐ   r¹   rÎ   rD   r¾   rÒ   r¬   Únextrk   rp   ÚwarnrX   r'   Úsleepr«   rò   )
rê   Úerr_msgÚerG   Údelayr  rÔ   r\   râ   Útransport_gens
        €€€€€r#   rã   Ú)Component._start.<locals>.transport_check°  s  ø€ Ø�H‰H�N‰NÐ5Ô6à×&Ñ&×(Ñ(ØV�Ø—‘—‘˜gÔ&ðÜ& wÓ/Ð/ð
 ä  Ó/�	à×*Ñ*×,Ñ,Ø-6Ð'¨Ñ*Øñ ð ×(Ñ(Ó*ˆEØ�H‰H�M‰MØlØ'Ÿm™mØ'Ÿm™mØ %ð	 ñ ô "ŸKšK¨Ó.ˆDŒMÜ×Ò §¡¨ÀÕFøô+ $ó Ü—L’L §¡¨qÔ1Üûðús   ÁD Ä
D7Ä!D2Ä2D7r™   )r¬   r¾   rð   rò   Ú	itertoolsÚcycler£   rñ   )r\   r  rÂ   rÅ   Ústart_fr  rÁ   rÔ   râ   rã   r  s   ``   @@@@@@r#   Ú_startÚComponent._start&  sÛ   ÿ€ ð$ �<‰<Ñ#Ü×#Ò#Ó%ˆAõ&ô ×Ò §¡¨cÔ7ØˆHô ×*Ò*Ó,ˆŒõ	ô 	×Ò˜DŸL™L¨&Ô9ô "Ÿš¨×(8Ñ(8Ó9ˆð  !˜cÐõ	1÷L	Hð L	H÷\	Gñ 	Gð@ —)‘)˜G T¨4Ó0ˆÜ×Ò˜G _°eÔ<Ø�|‰|Ðr%   c                 óÜ  • SU l         U R                  (       a9  U R                  R                  5       (       a  U R                  R                  5       $ U R                  (       a/  [
        R                  " [
        R                  U R                  5      $ [
        R                  " U R                  5      (       d!  [
        R                  " U R                  S 5        [
        R                  " S 5      $ )NT)r®   r­   Úis_attachedrœ   r«   r¾   rþ   ÚcancelÚ	is_calledr¬   r¿   Úcreate_future_successrd   s    r#   ÚstopÚComponent.stopÔ  s�   € ØˆŒØ�=�=˜TŸ]™]×6Ñ6×8Ñ8Ø—=‘=×&Ñ&Ó(Ð(Ø�]�]ô —?’?¤5§<¡<°·±Ó?Ð?ô
 �Š˜tŸ|™|×,Ñ,Ü�MŠM˜$Ÿ,™,¨Ô-Ü×*Ò*¨4Ó0Ð0r%   c                 ó`  ^ ^^^• T R                   R                  STR                  TR                  5       S9  [        R
                  " 5       mUUU U4S jnT=R                  S-  sl        [        R                  " T R                  TTUT5      nUU4S jn[        R                  " US U5        T$ )NzWconnecting once using transport type "{transport_type}" over endpoint "{endpoint_desc}")Útransport_typeÚendpoint_descc                  óŒ  >• [        TR                  TR                  5      n  TR                  U 5      =Tl        nTR
                  R                  5        HJ  u  p#[        U[        5      (       a  UR                  U5        M-  [        U40 UD6nUR                  U5        ML     TUl        U
U4S jnUR                  SU5        U
UUU4S jnTR                  b  UR                  SU5        U
U4S jnUR                  SU5        U$ ! [         a3  n[        R                   " U5      n	[        R"                  " T
U	5        e S nAff = f)Nc                 óX  >• TR                   R                  SUS9  [        R                  " T5      (       dt  UR                  S;   a  [        R
                  " TS 5        g [        R                  " [        UR                  UR                  5      5      n[        R                  " TU5        g g )Nz"session leaving '{details.reason}'©r…   )zwamp.close.normalzwamp.close.goodbye_and_out)
rÍ   rÎ   r¾   r  rØ   r¿   Úcreate_failurer
   ÚmessagerÒ   )r„   r…   ÚfÚdoner\   s      €€r#   Úon_leaveÚAComponent._connect_once.<locals>.create_session.<locals>.on_leave  s�   ø€ Ø—H‘H—M‘MØ<Ø 'ð "ñ ô !Ÿ?š?¨4×0Ñ0Ø"Ÿ>™>Ð-`Ó`Ü!ŸMšM¨$°Õ5ä %× 4Ò 4Ü 0°·±ÀÇÁÓ Qó!˜Aô "ŸLšL¨¨qÕ1ð 1r%   rœ   c                 ó  >^ • TR                  5         T=R                  S-  sl        TR                  R                  SUS9  [        R
                  " TR                  TT 5      nUU 4S jnUUU 4S jn[        R                  " X#U5        g )NrW   zsession on_join: {details}r!  c                 óv   >• TR                   R                  S5        U4S jn[        R                  " SU5        g )NÚmain_successc                  óH   >•  T R                  5         g ! [         a     g f = fr½   )rœ   r	   )r„   s   €r#   rœ   ÚeComponent._connect_once.<locals>.create_session.<locals>.on_join.<locals>.main_success.<locals>.leave'  s%   ø€ ð%Ø '§¡¥øÜ#2ó %ñ !%ð%ús   ƒ ”
! !r   )rÍ   rÐ   r¾   rÞ   )rê   rœ   r\   r„   s     €€r#   r*  ÚVComponent._connect_once.<locals>.create_session.<locals>.on_join.<locals>.main_success$  s*   ø€ ØŸ™Ÿ™ ~Ô6õ%ô ×(Ò(¨¨EÕ2r%   c                 óˆ   >• TR                   R                  SU S9  [        R                  " TU 5        TR	                  5         g )Nzmain_error: {err})Úerr)rÍ   rÐ   r¾   rÒ   r�   )r/  r%  r\   r„   s    €€€r#   Ú
main_errorÚTComponent._connect_once.<locals>.create_session.<locals>.on_join.<locals>.main_error0  s2   ø€ ØŸ™Ÿ™Ð':À˜ÑDÜŸš T¨3Ô/Ø×*Ñ*Õ,r%   )r[   ra   rÍ   rÐ   r¾   rþ   r¢   rò   )	r„   r…   rÁ   r*  r0  r%  Úreactorr\   rG   s	   `    €€€€r#   Úon_joinÚ@Component._connect_once.<locals>.create_session.<locals>.on_join  se   ù€ Ø—O‘OÔ%Ø×.Ò.°!Ñ3Õ.Ø—H‘H—N‘NÐ#?È�NÑQÜŸš¨¯©°W¸gÓF�Aö
3÷-ô ×'Ò'¨¸ÕDr%   r@   c                 óæ   >• TR                   R                  SUS9  [        R                  " T5      (       d;  U(       d  TR                   R	                  S5        g [        R
                  " TS 5        g g )Nz,session on_disconnect: was_clean={was_clean})Ú	was_cleanzSession disconnected uncleanly)rÍ   rÐ   r¾   r  r	  r¿   )r„   r6  r%  r\   s     €€r#   Úon_disconnectÚFComponent._connect_once.<locals>.create_session.<locals>.on_disconnect;  sZ   ø€ Ø—H‘H—N‘NØFØ"+ð #ñ ô !Ÿ?š?¨4×0Ñ0Þ(Ø ŸH™HŸM™MØ @õô "ŸMšM¨$°Õ5ð 1r%   r�   )r   r©   rª   r¨   r­   r§   Úitemsr   r   Úadd_authenticatorr   Ú_parentrŠ   r¢   Ú	Exceptionr¾   r"  rÒ   )Úcfgr„   Ú	auth_nameÚauth_configÚauthenticatorr&  r3  r7  r  r$  r%  r2  r\   rG   s             €€€€r#   Úcreate_sessionÚ/Component._connect_once.<locals>.create_sessionð  s  ø€ Ü! $§+¡+¨t¯{©{Ó;ˆCðZØ*.×*>Ñ*>¸sÓ*CÐC�” Ø.2×.BÑ.B×.HÑ.HÖ.JÑ*�IÜ! +¬~×>Ñ>Ø×1Ñ1°+Ö>ä(<¸YÑ(VÈ+Ñ(V˜Ø×1Ñ1°-Ö@ñ /Kð& #'�”ö
2ð —
‘
˜7 HÔ-÷
Eð Eð. —;‘;Ñ*Ø—J‘J˜v wÔ/ö
6ð —
‘
˜<¨Ô7ð �øôc ó ô ×(Ò(¨Ó+�Ü—’˜T 1Ô%Øûðús   £B D Ä
EÄ.D>Ä>ErW   c                 ó–   >• T=R                   S-  sl         [        R                  " T5      (       d  [        R                  " TU 5        gg)zË
this may seem redundant after looking at _connect_transport, but
it will handle a case where something goes wrong in
_connect_transport itself -- as the only connect our
caller has is the 'done' future
rW   N)rb   r¾   r  rÒ   )r/  r%  rG   s    €€r#   Úon_errorÚ)Component._connect_once.<locals>.on_errorU  s:   ø€ ð ×&Ò&¨!Ñ+Õ&ô —?’? 4×(Ñ(Ü—’˜T 3Õ'ð )r%   )
rÍ   rÎ   r   rs   r¾   rð   r`   rþ   Ú_connect_transportrò   )r\   r2  rG   rA  rÁ   rD  r%  s   ```   @r#   rÿ   ÚComponent._connect_onceä  sž   û€ à�‰�‰ð.à$Ÿ>™>Ø#×5Ñ5Ó7ð	 	ñ 	
ô ×"Ò"Ó$ˆ÷\	ð \	ð| 	×"Ò" aÑ'Õ"ä�OŠOØ×#Ñ#Ø�Y °ó
ˆö
	(ô 	×Ò˜A˜t XÔ.àˆr%   c                 ó(   • U R                  SU5        g)zÂ
A decorator as a shortcut for listening for 'join' events.

For example::

   @component.on_join
   def joined(session, details):
       print("Session {} joined: {}".format(session, details))
r@   Nr‰   ©r\   r†   s     r#   r3  ÚComponent.on_joine  s   € ð 	�‰�˜Õr%   c                 ó(   • U R                  SU5        g)z=
A decorator as a shortcut for listening for 'leave' events.
rœ   Nr‰   rI  s     r#   r&  ÚComponent.on_leaveq  ó   € ð 	�‰�˜Õr%   c                 ó(   • U R                  SU5        g)z?
A decorator as a shortcut for listening for 'connect' events.
rš   Nr‰   rI  s     r#   Ú
on_connectÚComponent.on_connectw  s   € ð 	�‰�	˜2Õr%   c                 ó(   • U R                  SU5        g)zB
A decorator as a shortcut for listening for 'disconnect' events.
r�   Nr‰   rI  s     r#   r7  ÚComponent.on_disconnect}  s   € ð 	�‰�˜bÕ!r%   c                 ó(   • U R                  SU5        g)z=
A decorator as a shortcut for listening for 'ready' events.
r›   Nr‰   rI  s     r#   Úon_readyÚComponent.on_readyƒ  rM  r%   c                 ó(   • U R                  SU5        g)zF
A decorator as a shortcut for listening for 'connectfailure' events.
rž   Nr‰   rI  s     r#   Úon_connectfailureÚComponent.on_connectfailure‰  s   € ð 	�‰Ð  "Õ%r%   )r§   r«   r¬   r¢   rª   r¡   r©   r­   r®   r£   r¨   )NF)NNNÚrealm1NNNNr½   )rv   rw   rx   ry   rz   r¨   rƒ   r’   r]   r¹   r  r  rÿ   r3  r&  rO  r7  rT  rW  r{   r|   r%   r#   r   r   g  sd   † ñð
 €Oðôô.ð. W[ØEIô}ò~ôlò\1ò òB
òòò"òõ&r%   c                 ó>  ^ ^^
^^• [        U[        5      (       a  U/n[        U5      [        :w  a#  [	        SR                  [        U5      5      5      eU H;  n[        U[        5      (       a  M  [	        SR                  [        U5      5      5      e   [        R                  " 5       mU4S jmU4S jm
U
UU 4S jn/ nU H  nU" U5      nUR                  U5        M     [        R                  " USS9nT(       a  UUU 4S jn	[        R                  " X‰U	5        U$ )	ah  
Internal helper. Use "run" method from autobahn.twisted.wamp or
autobahn.asyncio.wamp

This is the generic parts of the run() method so that there's very
little code in the twisted/asyncio specific run() methods.

This is called by react() (or run_until_complete() so any errors
coming out of this should be handled properly. Logging will
already be started.
zB"components" must be a list of Component objects - encountered {0}zN"components" must be a list of Component objects - encountereditem of type {0}c                 ó(   >• TR                  SXS9  U$ )Nz-Component '{c}' successfully completed: {arg})ÚcrÀ   ©rÐ   )ÚcomprÀ   rÍ   s     €r#   Úcomponent_successÚ_run.<locals>.component_success±  s   ø€ Ø�	‰	ÐAÀTˆ	ÑSØˆ
r%   c                 ó˜   >• TR                  SU [        R                  " U5      S9  TR                  S[        R                  " U5      S9  g )NzComponent '{c}' error: {msg})r\  rÉ   zComponent error: {tb}rË   )rÔ   r¾   rÏ   rÐ   rÑ   )r^  r$  rÍ   s     €r#   Úcomponent_failureÚ_run.<locals>.component_failureµ  sC   ø€ Ø�	‰	Ð0°D¼e×>SÒ>SÐTUÓ>Vˆ	ÑWØ�	‰	Ð)¬e×.LÒ.LÈQÓ.Oˆ	ÑPð r%   c                 ó¢   >• [         R                  " U R                  T5      n[         R                  " U[	        TU 5      [	        TU 5      5        U$ r½   )r¾   rþ   r™   rò   r   )r^  rÁ   rb  r_  r2  s     €€€r#   Úcomponent_startÚ_run.<locals>.component_start½  sG   ø€ ô �OŠO˜DŸJ™J¨Ó0ˆÜ×ÒØÜÐ% tÓ,ÜÐ% tÓ,ô	
ð
 ˆr%   F)Úconsume_exceptionsc                 ó:   >• TR                  S5        T" TU 5        g )Nz&All components ended; stopping reactorr]  )rÀ   Údone_callbackrÍ   r2  s    €€€r#   Úall_doneÚ_run.<locals>.all_doneÒ  s   ø€ Ø�I‰IÐ>Ô?Ù˜' 3Õ'r%   )r   r   r   r<   r   r   r¾   Úmake_loggerr¥   Úgatherrò   )r2  Ú
componentsri  r\  re  Údlr^  rÁ   Údone_drj  rb  r_  rÍ   s   ` `       @@@r#   Ú_runrq  �  sõ   ü€ ô �*œi×(Ñ(Ø �\ˆ
äˆJÓœ4ÓÜðß‘6œ$˜zÓ*Ó+ó
ð 	
ó
 ˆÜ˜!œY×'Ó'Üð#ß#)¡6¬$¨q«'£?óð ñ ô ×
Ò
Ó
€Cõõ÷	ð 
€BÛˆÙ˜DÓ!ˆØ
�	‰	�!Žñ ô �\Š\˜"°Ñ7€Fæ÷	(ô 	×Ò˜F¨hÔ7à€Mr%   r½   )r  rn   Ú	functoolsr   r¾   Úautobahn.utilr   Úautobahn.websocket.utilr   r;   Úautobahn.rawsocket.utilrC   Úautobahn.wamp.typesr   r   r   Úautobahn.wamp.exceptionr	   r
   Úautobahn.wamp.authr   r   Úautobahn.wamp.serializerr   Ú__all__r$   rT   ÚobjectrE   r   rq  r|   r%   r#   Ú<module>r|     sf   ðó8 Û Ý ã å )Ý =Ý =ç RÑ Rß Eß CÝ 1ð ð ô
63ôr[ô|X#�ô X#ô~f&�ô f&õRGr%   